Asg*_*gel 9 haskell frp reactive-banana
我目前正在开发一款利用活性香蕉和SDL的小游戏.由于目标主要是为了更多地了解反应性香蕉和FRP,我尝试使用动态切换来设置游戏对象的集合,但到目前为止还没有取得多大成功.
在Bartab示例中,我发现了唯一使用事件切换的示例,最终触发在集合中创建新条目的事件是从事件网络外部获取的,而不是使用内部事件.我的问题是:这是唯一的方法,还是这个例子的特例?
在活性香蕉中是否还有更多动态事件切换示例?
根据我的理解,我得到一个时刻t(Anytime Behavior a),使用execute创建一个事件t(Anytime Behavior a),然后用于更新携带集合的Behavior.使用trimB对从触发事件创建的行为创建时刻t(任意时间行为a).如果此触发事件源自事件网络,则不会使用错误消息"无法推断(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)
[...]
Run Code Online (Sandbox Code Playgroud)
我只是尝试从示例中镜像newEntry/eNewEntry,只是使用普通事件来创建新行为.这会在spawnPos中产生"无法推断(t~s)"错误.
EDIT2:
它工作,但现在我使用执行创建事件的行上出现相同的错误."无法推断t~t1"
在我看来,除了一个小错误之外,代码基本上是正确的:
编译器正确地抱怨spawnPos具有(多态)开始时间s,而 的开始时间eSpawnEvent固定为t,这是不同的。forall t后一个时间通过的类型签名中的部分纳入范围setupNetwork。也就是说,t代表整个网络的启动时间。
简单的解决方法是将有问题的行更改为
spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |