0

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

我正在开发一款游戏。我有游戏对象。我有游戏行为。我的游戏对象的属性在一个包含所有详细信息的 XML 文件中定义。

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

因此,当一个游戏对象被实例化时,基于 XML 中的行为属性的值,它以某种方式附加了行为。我需要该行为能够访问其父级的所有属性,以便它可以说移动对象以及不...

我对设计模式没有太多经验......其中一些似乎几乎是正确的,但我读过的例子似乎都没有让我觉得它是正确的。

我正在使用 AS3,但请随意使其更通用。

4

2 回答 2

0

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

所以你的游戏对象可能有一个 initFromXML(xml) 方法,或者可能有一个将 xml 作为参数的静态工厂方法。这会解析 xml 并查找行为,然后创建适当的行为。可以使用另一个工厂来创建行为。

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

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

于 2010-01-08T15:31:53.673 回答
0

我想我理解你的方法。

这在游戏中经常出现,因为您可能拥有无限数量的效果、状态、行为等。

我在您的问题中看到的是您正在处理更多功能性问题,例如“这是否跟随此鼠标”,“这是否响应键盘命令”等...

在这种情况下,您可以做的是创建功能类,例如“MouseFollower”或“KeyboardResponder”,它们通常接受 GameObject 作为其构造函数的参数。

然后这些对象可以将事件处理程序直接应用于游戏对象,例如事件监听器。

您可以将所有功能对象存储在 GameObject 中的一个数组中,以备不时之需。

当它们在数组中时,您还可以像创建具有统一方法集的功能类接口一样酷。因此,例如,如果 GameObject 被渲染为非活动或禁用,您可以说

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

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

于 2010-01-08T15:49:41.663 回答