【问题标题】:Dynamic Event Switching in Reactive-BananaReactive-Banana 中的动态事件切换
【发布时间】: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


【解决方案1】:

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

编译器正确地抱怨spawnPos 具有(多态)开始时间s,而eSpawnEvent 的开始时间固定为t,这是不同的。后一次通过setupNetwork 类型签名中的forall t 部分进入范围。也就是说t代表全网的开始时间。

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

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

【讨论】:

  • 谢谢,它有帮助,但不完全。
  • 我再次编辑了这个问题,以防你没有看到它。还是一样的错误。
  • 啊,我明白了。从 GHC 发布代码和特定错误消息(也显示受影响的表达式)总是有帮助的。您的问题是,即使您的其他问题得到解决,您对FrameworksMoment spawnPos 的使用也没有为eSpawnPos 提供正确的类型。您必须将 AnyMoment 事物转换为 FrameworksMoment,而不是 Moment s (AnyMoment ...) 事物。前者可以通过写spawnPos &lt;- trimB ...而不是等号=来获得。
  • 在任何情况下,您似乎都很难处理forall 的问题。这并不难,但也不完全简单。关于forall在动态事件切换中的使用基本介绍,推荐my introductory description。您的问题可能比一个简单的 StackOverflow 答案更深刻。
  • 谢谢,我会看文章的。尽管如此,编译器仍然希望在执行行上出现“Moment t1 a0”而不是“AnyMoment Behavior DSCoord”。
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多