9

私は現在、リアクティブ バナナと 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 を推測できませんでした」

4

1 に答える 1

4

小さな間違いを除いて、コードは本質的に正しいように見えます。

コンパイラは、 の開始時刻が に固定されているのに対し、 の開始時刻はspawnPos(ポリモーフィック) であると正しく不平を言いますが、これは異なります。後者の時間は、 の型シグネチャの部分を介してスコープに取り込まれます。つまり、ネットワーク全体の開始時刻を表します。seSpawnEventtforall tsetupNetworkt

簡単な修正は、問題のある行を次のように変更することです

spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord)
于 2013-03-03T08:46:30.910 に答える