首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个包含当前滴答值与前一个滴答值之差的事件?

如何创建一个包含当前滴答值与前一个滴答值之差的事件?
EN

Stack Overflow用户
提问于 2016-02-08 14:58:44
回答 1查看 99关注 0票数 2

我在一个类似游戏的项目中使用reactive-bananasdl2 (使用这个胶水库)。为“绝对鼠标位置”创建Behavior,为“相对鼠标位置”创建Behavior (a.k.a )。鼠标移动)。当不使用玻璃钢时,效果很好,但玻璃钢的“相对鼠标定位”就成了一个问题:似乎只有少量的数据通过。我怀疑这是因为底层的"SDL事件“(我们用Behavior表示)与滴答Event没有很好地对齐。

因此,我想计算我自己的鼠标移动,简单地比较鼠标位置在当前的滴答和位置在前一个滴答。我不确定这是否能解决我的问题,但我有很好的希望:)

首先,我对如何处理它感到迷茫:State monad或IORef,还是reactive-banana提供了另一种方法?

我将给出我目前拥有的代码的一小部分:

代码语言:javascript
复制
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 (称为mousePositionE)的mousePositionB和以前的tickE中的mousePositionE值来表示mousePositionE

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-08 17:19:02

您正在寻找从事件流构建事件的accumE。我强烈建议阅读文档中的递归部分,其中描述了如何用stepperapply实现递归。

代码语言:javascript
复制
accumE :: MonadMoment m => a -> Event (a -> a) -> m (Event a)
--        starting value --^           |             |
--  stream of events that modify it  --^             |
--  resulting events                               --^

要用accumE计算两点之间的差异,我们需要跟踪前一点。我们还将跟踪当前的情况。这将保留一个关于最近事件的两项历史。

代码语言:javascript
复制
  (Point V2 CInt , Point V2 CInt)
-- previous value, current value

edges :: MonadMoment m => a -> Event a -> m (Event (a, a))
edges initial later = accumE (initial, initial) (shift <$> later)
    where
        shift x2 (x0, x1) = (x1, x2)

为了得到差异,我们将从当前的一个减去前一个。这将提供一个完整的网络,如

代码语言:javascript
复制
makeNetwork :: GraphicsData -> SDLEventSource -> MomentIO ()
makeNetwork gd sdlEventSource = mdo
  tickE          <- tickEvent sdlEventSource
  mousePositionB <- fromPoll SDL.getAbsoluteMouseLocation

  let mousePositionE = mousePositionB <@ tickE

  mouseHistoryE <- edges zero mousePositionE

  let mouseMovementE = (\(x0, x1) -> x1 ^-^ x0) <$> mouseHistoryE

  -- ...

zero^-^来自Linear.Vector

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35272631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档