3

ゲームのようなプロジェクトにreactive-bananaand sdl2(このグルー ライブラリを使用) を使用しています。は、「マウスのBehavior絶対位置」およびBehavior「マウスの相対位置」(別名マウスの動き) に対して作成されます。FRP を使用しない場合、これはうまく機能しますが、FRP を使用すると、「相対的なマウスの位置」が問題になります。少量のデータしか通過しないようです。これは、基礎となる「SDL イベント」( a で表すBehavior) が tick とうまく一致しないために発生すると思われEventます。

したがって、現在のティックでのマウスの位置を前のティックでの位置と比較するだけで、自分のマウスの動きを計算したいと考えています。これで問題が解決するかどうかはわかりませんが、希望はあります:)

まず第一に、私はそれにアプローチする方法に迷っています:Stateモナド、または 、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したいと思います。mousePositionBtickEmousePositionEmousePositionEtickE

どんな助けでも大歓迎です!

4

1 に答える 1

2

accumEイベントのストリームからイベントを構築するものを探しています。と の観点から実装方法を説明しているドキュメントの再帰セクションを読むことを強くお勧めしstepperますapply

accumE :: MonadMoment m => a -> Event (a -> a) -> m (Event a)
--        starting value --^           |             |
--  stream of events that modify it  --^             |
--  resulting events                               --^

で 2 点間の差を計算するにaccumEは、前の点を追跡する必要があります。また、現在のポイントを追跡します。これにより、最新のイベントの小さな 2 つの項目の履歴が保持されます。

  (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)

差を得るために、現在のものから前のものを引きます。これにより、次のような完全なネットワークが得られます

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

于 2016-02-08T17:19:02.207 に答える