9

我目前正在开发一个使用反应香蕉和 SDL 的小游戏。由于目标主要是了解更多关于响应式香蕉和 FRP 的知识,因此我尝试使用动态切换来设置游戏对象的集合,但到目前为止还没有取得多大成功。

在 Bartab 示例中,我发现唯一使用事件切换的示例,最终触发在集合中创建新条目的事件是从事件网络外部获取的,而不是使用内部事件。我的问题是:这是唯一的方法还是只是这个例子的一个特例?

在反应香蕉中是否有更多动态事件切换的例子?

据我了解,我得到了一个 Moment t(Anytime Behavior a),使用 execute 创建一个 Event t(Anytime Behavior a),然后又用于更新携带集合的 Behavior。Moment t (Anytime Behavior a) 是在从触发事件创建的行为上使用 trimB 创建的。如果此触发事件源自事件网络,则不会编译并显示错误消息“无法推断 (t ~ t1)”。我不确定 ~ 到底是什么意思,但它显然会引发错误,因为事件网络的两个框架值 (t) 和这个新的 Moment 值不同。

所以,长话短说,我不明白反应香蕉中的事件切换是如何工作的,我不知道为什么。理论上应该相对简单。

编辑:

-- 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 中产生“无法推断 (t ~ s)”错误。

编辑2:

它可以工作,但现在在我使用执行创建事件的行上出现了同样的错误。“无法推断出 t ~ t1”

4

1 回答 1

4

在我看来,除了一个小错误之外,代码基本上是正确的:

编译器正确地抱怨spawnPos具有(多态)开始时间s,而开始时间eSpawnEvent固定为t,这是不同的。forall t后一种时间通过setupNetwork. 也就是说,t表示整个网络的开始时间。

简单的解决方法是将违规行更改为

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