【问题标题】:How to make Behaviors contain other Behaviors in reactive-banana如何使行为包含反应香蕉中的其他行为
【发布时间】:2013-06-16 11:21:40
【问题描述】:

似乎每个人都在用响应式香蕉 FRP 框架做电脑游戏,所以我也不得不尝试一下。但是,我坚持早期的步骤,试图将游戏数据描述为响应式香蕉Behavior 类型。

基本上,我正在尝试创建一个(不断变化的)游戏角色列表(例如佛罗多或山姆)。游戏角色可能会在每个游戏滴答时更新(建模为滴答事件)。这个想法是,每当游戏角色发生变化时,都会触发一个Event (Character),并最终通过网络发送角色更新。与Asteroids.hs 示例相比,这样做的好处应该是整个游戏状态(整个游戏角色列表)不需要通过网络发送,因为会有许多事件具有单个游戏角色而不是带有游戏角色列表的单个事件。

对于单个游戏角色,这很好用!我用mapaccum 创建了Behavior (Character),以便在更新字符时发送字符更新信号。我无法解决的问题是如何使用Behavior 游戏角色列表来完成这项工作。

我正在尝试将游戏角色列表建模为Behavior,因为角色可能会在游戏中来来去去。我需要在这里使用动态事件切换吗?或者,如果我不将Behavior 用于单个游戏角色(并且仅将Behavior 用于游戏角色列表),是否有办法在我浏览角色列表时有条件地触发更新事件?还是我这里有什么不明白的地方?

【问题讨论】:

    标签: haskell reactive-programming frp reactive-banana


    【解决方案1】:

    要管理动态的行为集合,您必须使用动态事件切换。有关演示,请参见 BarTab.hs 示例。

    但是,动态事件切换可能有点笨拙,通常可以避免。两种常见的情况是:

    1. 行为集合是静态已知的。 TwoCounters.hs 展示了可以简单地使用应用函子组合器来计算取决于任一行为的值。
    2. 可以将动态集合建模为集合的行为 (Behavior [a]),而不是行为集合 ([Behavior a])。 Asteroids.hs 示例演示了如何使用它。这是一种风格上的折衷:集合的各个条目不能再使用 FRP 进行表述,但集合变得更易于管理。

    【讨论】:

    • 好吧,我有点想这可能会证明是这样。我想我会尝试您提到的“集合行为”方式,然后过滤掉未更改的字符。
    • 特别是,我想我会使用spill函数将字符列表更新的事件拆分为多个事件以更新单个字符。
    猜你喜欢
    • 2011-09-25
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多