用XML定义游戏对象行为

时间:2010-01-08 09:40:04

标签: xml actionscript-3 design-patterns behavior

我确信我的问题有一个设计模式解决方案,但我似乎无法确定一个可行的方法是什么。我知道我想要什么,我只是无法建立联系......我会解释:

我正在开发一款游戏。我有GameObjects。我有GameBehaviors。我的GameObjects的属性在XML文件中定义,该文件包含所有细节。

<type name="Object">
    <unit name="follower" behavior="followMouse" >
        ...other unit info here...
    </unit>
</type>

因此,当游戏对象被实例化时,基于XML中的行为属性的值,以某种方式具有附加到其上的行为。我需要行为能够访问它的父级的所有属性,这样它就可以说移动对象而不是...

我对设计模式没有很多经验......而且其中一些看起来几乎是正确的,但我读过的所有例子都没有让我点击它。

我正在与AS3合作,但随意让它变得更加通用。

2 个答案:

答案 0 :(得分:0)

我建议使用组合,尽管您的主要目标应该是找到一个好的(可靠的,可扩展的和可维护的)解决方案而不是使用命名设计模式。

因此,您的游戏对象可能具有initFromXML(xml)方法,或者可能具有将xml作为参数的静态工厂方法。这将解析xml并查找行为,然后创建适当的行为。创建行为可以在另一家工厂完成。

然后将行为添加到游戏对象行为列表中。行为可能都是来自公共类的对象,或者它们都可能实现IBehavior接口。

行为可以通过游戏对象调用或添加事件侦听器来完成它们。

答案 1 :(得分:0)

我想我理解你的做法。

这在游戏中出现了很多,因为你可能会有无数的效果,状态,行为等。

我在你的问题中看到的是你正在处理更多功能性的事情,比如“这是否遵循这个鼠标”,“这是否响应键盘命令”等等......

在这种情况下,你可以做的是创建像“MouseFollower”或“KeyboardResponder”这样的函数类,它们通常接受GameObject作为构造函数的参数。

然后,这些对象可以直接将事件处理程序应用于GameObject,例如eventlisteners。

您可以将所有功能对象存储在GameObject中的数组中,以备需要删除时使用。

当它们在数组中时,你也可以做酷,就像用一组统一的方法创建一个功能类接口一样。因此,例如,如果GameObject被渲染为无效或禁用,您可以说

for each IFunctionalObject in GameObject.FunctionalObjects
IFunctionalObject.disable()

我想这种方法是可以容忍的,如果你有各种各样的游戏对象,我想RPG将是一个很好的例子,你可以管理大量不同功能的精灵。