我正在使用reactive-banana
和sdl2
(使用这个胶水库)进行类似游戏的项目。ABehavior
是为“绝对鼠标位置”创建的,以及为Behavior
“相对鼠标位置”(也就是鼠标移动)创建的。不使用 FRP 时效果很好,但使用 FRP 时,“相对鼠标位置”会成为问题:似乎只有少量数据通过。我怀疑发生这种情况是因为底层的“SDL 事件”(我们用 a 表示Behavior
)没有与 tick Event
s 很好地对齐。
所以我想计算我自己的鼠标移动,只需将当前刻度的鼠标位置与前一个刻度的位置进行比较。我不确定这是否能解决我的问题,但我有很好的希望:)
首先,我不知道如何处理它:State
monad,或 an IORef
,还是reactive-banana
提供另一种方法?
我将摘录我目前拥有的代码:
makeNetwork :: GraphicsData -> SDLEventSource -> MomentIO ()
makeNetwork gd sdlEventSource = mdo
tickE <- tickEvent sdlEventSource
mouseMovementB <- fromPoll SDL.getRelativeMouseLocation
mousePositionB <- fromPoll SDL.getAbsoluteMouseLocation
let mousePositionE = mousePositionB <@ tickE
mouseMovementE = mouseMovementB <@ tickE -- this yields flaky data
-- ... the rest of the network description left out ...
如上所述,我想mouseMovementE
用mousePositionB
at current tickE
(称为mousePositionE
)和mousePositionE
previous 的值来表达tickE
。
任何帮助是极大的赞赏!