Haskell Gloss:每n帧

时间:2014-10-29 21:52:40

标签: haskell timer handler

我有这个timeHandler函数,每个帧执行一次,自应用程序启动以来经过的时间作为浮动参数传递:

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。

2 个答案:

答案 0 :(得分:1)

关于如何调试这个的一些想法......

首先,t时间是秒还是帧数?因为如果它是以秒为单位的时间,请注意你将以每10帧的倍数开始的每一帧开始(即 - 如果你每秒有20帧,它将在20秒和21秒之间发射20次)。

否则,你在这里展示的代码对我来说是正确的......因为每t = 10 * n它将评估为True。

要找到问题,我会在通话中使用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)

等,看它是否真的被触发了。

如果在这样做之后,您仍然感到困惑,请告诉我们您在这里学到了什么,我们可以提供帮助。

答案 1 :(得分:1)

问题'是时候不会改变。它因其名称而具有误导性,但时间是游戏运行时的当前POSIXtime。它不是一个错误,它仅用于初始化(例如RndGen)。如果您想使用更改时间值,则必须手动实施。

time <- round <$> getPOSIXTime

主要方法是唯一设置时间值的地方。