私は現在、反応性バナナとSDLを利用した小さなゲームに取り組んでいます。目標は主に反応性のバナナとFRPの詳細を学ぶことなので、動的な切り替えを使用してゲームオブジェクトの集合を設定しようとしましたが、これまでのところ大きな成功はありませんでした。リアクティブバナナでのダイナミックイベントスイッチング
私が見つけたイベント交換を使用する唯一の例では、内部イベントを使用するのではなく、イベントネットワークの外側からコレクションの新しいエントリの作成を最終的に引き起こすイベントが取得されます。私の質問です:これを行う唯一の方法ですか、この例のための特別なケースですか?
リアクティブバナナで使用されている動的イベント切り替えの例はありますか?
モーメントt(任意のビヘイビアa)を取得するには、executeを使用してイベントt(任意のビヘイビアa)を作成し、次にコレクションを保持するビヘイビアを更新するために使用します。 モーメントt(任意のビヘイビアa)は、トリガイベントから作成されたビヘイビアでtrimBを使用して作成されます。このトリガーイベントがイベントネットワークで発生した場合、「Could not dedus(t〜t1)」というエラーメッセージとともにコンパイルされません。私は〜が何を意味するのかよく分かりませんが、イベントネットワークの2つのフレームワーク値(t)とこの新しいモーメント値が異なるため、明らかにエラーをスローします。
短いストーリーで、私はリアクション・バナナのイベント・スイッチングがどのように機能しているのか分かりません。理由はわかりません。それは理論的には比較的簡単であるはずです。
編集:私は単純に新しい動作を作成するために、通常のイベントを使用して、例からnewEntry/eNewEntryを反映しようとした
-- 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)
[...]
。これにより、spawnPosで「推論できません(t〜s)」というエラーが生成されます。
EDIT2:
それは動作しますが、今、同じエラーが、私は、イベントを作成するために実行使うライン上にアップしています。
コンパイラが正しくspawnPos
は開始時間ながら時間s
を開始(多型)があることを不平を言う:コードがマイナーな間違いを除き、基本的に正確であるように私には見える
に問題のある行を変更することがありますか? –
質問をコード例で更新しました。 – AsgarZigel