如何使行为在reactive-banana中包含其他行为

时间:2013-06-19 19:15:02

标签: haskell reactive-programming frp reactive-banana

似乎每个人都在使用反应性香蕉FRP框架进行电脑游戏,所以我也必须尝试一下。但是,我坚持早期的步骤,试图将游戏数据描述为反应性香蕉Behavior类型。

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

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

我正在尝试将游戏角色列表建模为Behavior,因为角色可能会在游戏过程中出现。我需要在这里使用动态事件切换吗?或者,如果我不将Behavior与单个游戏角色一起使用(并且仅将Behavior与游戏角色列表一起使用),是否有办法在我通过角色时有条件地触发更新事件清单?或者我在这里不明白?

1 个答案:

答案 0 :(得分:5)

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

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

  1. 行为的集合是静态知道的。 TwoCounters.hs表明可以简单地使用applicative functor组合器来计算取决于任一行为的值。
  2. 动态集合可以建模为集合(Behavior [a])的行为,而不是行为集合([Behavior a])。 Asteroids.hs示例演示了如何使用它。这是一种风格权衡:系列的各个条目不再用FRP制定,但该系列变得更容易管理。