AS3:游戏中的模型和视图通信

时间:2009-07-24 21:26:21

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

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

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

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

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

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

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

当然这对我来说很有意义,因为我一直在使用代码一段时间。

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

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

编辑:我有一些工作要跟踪视图外部的当前layerset以及管理添加/删除相应事件侦听器并按照建议将更新事件委派给图层的模型。但是,请尽我所能改善这一点。

3 个答案:

答案 0 :(得分:1)

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

您的房间/图层/对象听起来像是父/子关系,可能是复合设计模式的理想选择。基本上这是一个树状结构,你可以触发一个事件,然后在所有分支中级联。如果您搜索“复合模式”,您可以更好地解释这对您的工作方式。

答案 1 :(得分:0)

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

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

另一个解决方案是对象注册时自身已经更改,通常以简单的布尔值的形式。在这种情况下,父(您的图层)将遍历所有子项,可以存储在某种形式的集合中,并处理所有那些说他们已被更改的人的更新。此解决方案从对象中删除了依赖关系,但在极端情况下,可能会导致性能问题,(极端情况是这么多对象,检查它们上面的单个布尔值的过程太多而无法处理(这将是很多对象))

希望有所帮助。

答案 2 :(得分:0)

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

- =崖>