【发布时间】:2013-02-16 06:56:59
【问题描述】:
我目前正在开发一个使用响应式香蕉和 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 中产生“Could not deduc (t ~ s)”错误。
编辑2:
它可以工作,但现在我使用执行创建事件的行出现了同样的错误。 "无法推断出 t ~ t1"
【问题讨论】:
-
我认为如果您发布无法编译的示例代码可能会有很大帮助?
-
我用代码示例更新了问题。
标签: haskell frp reactive-banana