私は現在、リアクティブ バナナと SDL を利用した小さなゲームに取り組んでいます。目標は主にリアクティブ バナナと FRP についてさらに学習することであるため、動的切り替えを使用してゲーム オブジェクトのコレクションをセットアップしようとしましたが、これまでのところあまり成功していません。
Bartab の例では、私が見つけたイベント切り替えを使用する唯一の例であり、コレクション内の新しいエントリの作成を最終的にトリガーするイベントは、内部イベントを使用する代わりに、イベント ネットワークの外部から取得されます。私の質問は、これが唯一の方法ですか、それともこの例の特殊なケースですか?
リアクティブバナナで使用されている動的イベントスイッチングの例は他にありますか?
私が理解していることから、瞬間t(いつでも振る舞いa)を取得し、実行を使用してイベントt(いつでも振る舞いa)を作成し、次にコレクションを運ぶ振る舞いを更新するために使用されます。瞬間 t (Anytime Behavior a) は、トリガー イベントから作成された Behavior で trimB を使用して作成されます。このトリガー イベントがイベント ネットワークで発生した場合、「Could not deduce (t ~ t1)」というエラー メッセージが表示されてコンパイルされません。~ が正確に何を意味するのかはわかりませんが、イベント ネットワークの 2 つのフレームワーク値 (t) とこの新しいモーメント値が異なるため、明らかにエラーがスローされます。
つまり、簡単に言うと、リアクティブ バナナのイベント スイッチングがどのように機能するのか理解できず、その理由もわかりません。理論的には比較的簡単なはずです。
編集:
-- Event Network
-- ==========================
setupNetwork :: forall t. Frameworks t => (EventSource Command, EventSource ()) -> IORef SpriteMap -> GameMap -> Moment t ()
setupNetwork ((addHandlerE, _), (addHandlerT, _)) sprites map = do
-- Input Events
----------------
eInput <- fromAddHandler addHandlerE -- Player Commands
eFrame <- fromAddHandler addHandlerT -- Event on each Frame
let
[...]
eSpawnEvent :: Event t (DSCoord)
eSpawnEvent = extractCoord <$> eLeftClick
where
extractCoord (LeftClick c) = c
spawnPos :: Frameworks s => Moment s (AnyMoment Behavior DSCoord)
spawnPos = trimB $ stepper (0,0) eSpawnEvent
eSpawnPos <- execute $ (FrameworksMoment spawnPos <$ eSpawnEvent)
[...]
通常のイベントを使用して新しい動作を作成するだけで、例から newEntry / eNewEntry をミラーリングしようとしました。これにより、spawnPos で「Could not deduce (t ~ s)」エラーが発生します。
編集2:
動作しますが、execute を使用してイベントを作成する行に同じエラーが表示されます。「t ~ t1 を推測できませんでした」