【问题标题】:AS3: Model and View Communication in a GameAS3:游戏中的模型和视图通信
【发布时间】:2009-07-24 21:26:20
【问题描述】:

所以我正在尝试将 MVC 模式用于我正在开发的游戏。到目前为止,一切进展顺利,但我无法弄清楚如何让我的模型和我的观点有效地相互交流。

我的一般模型结构涉及大量嵌套信息。

a Level has Rooms
    a Room have Layers
        a Layer has Objects

每一层在渲染它的视图中都有一个索引和一个对应的层。我需要对象在动画时发布更新消息,以便视图中的相应图层可以更新。我正在尝试使用内置的事件系统来处理这些更新。

我的问题是我不确定如何避免在游戏中的每个对象上设置监听器——这让我觉得很糟糕(也许我在这里错了)。如果我更改房间,该层无法从最后一个房间的对象中删除侦听器,因为它只能通过当前房间访问层。对象仅在当前房间中时更新,因此其他对象不需要触发事件。

视图设置为将事件级联到所有子节点,因此根节点可以接收所有更新(我认为我正确地做了那部分),并且图层可以匹配目标,因为它知道它正在渲染哪个图层。问题是将消息从对象传递到视图。

当然,这对我来说很有意义,因为我已经使用该代码有一段时间了。

如果我可以提供更多说明,请询问。这是我第一次使用 MVC 模式,所以我确信我可以做得更好。

如果您对我如何解决这个难题有任何建议,请分享!

编辑:我有一些东西可以从视图外部跟踪当前图层集,并且模型管理添加/删除适当的事件侦听器并按照建议将更新事件委托给图层。但是,请做任何我能做的来改善这一点。

【问题讨论】:

    标签: actionscript-3 model-view-controller event-handling


    【解决方案1】:

    如果您是 MVC 新手,您可能需要查看 PureMVC framework 的 AS3。当我第一次开始学习 MVC 时,我首先尝试构建自己的模式实现。在尝试了 PureMVC 之后,我对 MVC 的结构有了更深入的了解。

    您的房间/层/对象听起来像是父子关系,并且可能是复合设计模式的良好候选者。基本上,这是一个树状结构,您可以在其中触发一个事件,然后该事件将通过所有分支进行级联。如果您搜索“复合模式”,您可能会更好地了解它如何为您工作。

    【讨论】:

    • 我熟悉复合模式。我的观点是使用它。实际上更多的是相反的。我需要一个底部节点能够通知复合视图堆栈的顶部。不过,我将查看 PureMVC 以供参考。谢谢。
    • 这也是我的第一个想法。可靠的现有 MVC 实现是一个很好的学习工具。
    【解决方案2】:

    您可以采取一些解决方案,添加事件侦听器是合理的,但如上所述,您需要确保适当地清理它们,但这也是许多其他解决方案的要求。

    另一种方法是传入对象构造层,可能以“父”属性的形式。在这种情况下,只要对象发生更改,对象就会通知其父对象,然后在层更新时,它将遍历并处理所有已注册为已更改的对象。这具有性能优势,因为对象可以在渲染之间更改几次,但父级只会对这种更改采取一次行动(当它被告知更新自身时)。在这种情况下,您仍然需要确保清理您的正确引用以避免垃圾收集问题。

    另一种解决方案是对象自己注册为已更改,通常以简单布尔值的形式。在这种情况下,父级(您的层)将遍历所有子级,可能存储在某种形式的集合中,并为所有说他们已更改的人处理更新。此解决方案消除了对象与层之间的依赖关系,但在极端情况下,可能会导致性能问题,(极端情况是对象太多,检查单个布尔值的过程太多处理(这将是 很多对象))

    希望对您有所帮助。

    【讨论】:

    • 感谢您的意见。我有一个廉价的解决方案,类似于上一个我不满意的解决方案。我会尝试一些东西。我想我的问题是一些解决方案似乎太复杂了。似乎应该以某种方式将我的模型和视图链接起来,这会稍微优雅一些​​。
    【解决方案3】:

    在 PureMVC 中使用 Mediator 模式,而不是在每个对象上放置侦听器,您可以让 Mediator 侦听应用程序实例的事件。然后在实际对象中,发送一个冒泡事件,将显示层次结构冒泡到 Mediator 听到它的应用程序。然后中介采取适当的行动,例如发送通知以触发具有某种逻辑的命令。事件的目标当然是您世界中发送事件的项目,因此如果命令需要操作或检查该项目,则只需在通知正文中传递 event.target 即可。 QED。

    -=悬崖>

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多