gpt4 book ai didi

haskell - Reactive-Banana 中的动态事件切换

转载 作者:行者123 更新时间:2023-12-02 06:30:52 28 4
gpt4 key购买 nike

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

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

还有更多在响应式香蕉中使用动态事件切换的示例吗?

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

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

编辑:

-- 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:

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

最佳答案

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

编译器正确地提示 spawnPos 具有(多态)起始时间 s,而 eSpawnEvent 的起始时间固定为 t,这是不同的。后一个时间通过 setupNetwork 类型签名中的 forall t 部分纳入范围。也就是说,t代表整个网络的启动时间。

简单的解决方法是将有问题的行更改为

spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord)

关于haskell - Reactive-Banana 中的动态事件切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15163414/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com