2014-10-29 30 views
0

我有一個執行的每一幀和其經過的時間自應用程序啓動時爲浮動參數傳遞這個timeHandler功能:哈斯克爾光澤:做每N幀

timeHandler :: Float -> World -> World 
timeHandler time = ... my funcs ... 

現在我有一個函數不需要執行EACH幀,而是例如每10幀。所以,我想我會使用MOD功能這一點,但,這不是工作:

timeHandler time = if (((floor time) `mod` 10) == 0) then myFunc else id 

我想我會執行的函數,只有當除以10的時候沒有留下休息值,或者換句話說:執行它每10秒(至少這是我的想法)。但(顯然)它不起作用,似乎情況總是如此。

如果有人可以幫助我,這將是非常感謝!

此致敬禮, Skyfe。

+0

你的函數按你期望的方式工作 - 它將每10秒鐘應用'myFunc' 1秒鐘。如果你需要確定這一點 - '地圖(\時間 - >((樓層時間)'mod' 10)== 0)[9.95,10.00..11.05]'。你的錯誤幾乎肯定是其他地方。 – user2407038 2014-10-30 06:39:41

回答

1

'問題'是時間不變。由於它的名字,這是誤導,但時間是遊戲運行時的當前POSIX時間。這不是一個錯誤,它只用於初始化(例如RndGen)。如果你想使用一個不斷變化的時間值,你將不得不手動實現它。

time <- round <$> getPOSIXTime 

主要方法是唯一設置時間值的地方。

+0

啊,我知道了!之前沒有注意到,謝謝你指出。我會嘗試實現我自己的計時器的目的。 – user2999349 2014-10-30 17:23:44

1

如何調試這幾點思考....

首先,是t時間(秒),或幀數?因爲如果是在幾秒鐘內的時間,請注意,您將爲每一個以10的倍數開頭的幀開火(即,如果您有每秒20幀,它將在20s和21s之間觸發20次)。

否則,你在這裏顯示的代碼看起來對我來說是正確的....在這個例子中,它將評估爲True,每個t = 10 * n。

要查找的問題,我會在調用中使用Debug.Trace.trace,這樣

timeHandler t = trace (show t) $ 
       if (((floor time) `mod` 10) == 0) then myFunc else id 

,看什麼是未來。trace是一個函數(你應該僅用於調試,因爲它是不純),這將允許您實時查看值。看到t正在發送什麼值可以真正幫助你理解正在發生的事情。

你也可以看到trace的的

((floor time `mod` 10) == 0) 

等,值如果真的是越來越觸發。

如果這樣做後,你仍然感到困惑,告訴我們你在這裏學到了什麼,我們可以提供幫助。

+0

謝謝!不知怎的,它不斷地顯示出1.66666668e-2作爲時間價值,我不確定這是如何可能的,但那一定是錯誤。 – user2999349 2014-10-30 11:34:26