我正在开发视频游戏,我希望它具有高度可修改性。目前,我所有的游戏逻辑都是用 Python 定义的,我的引擎逻辑是用 C++ 定义的,我的数据是用 XML 定义的。我想给你解释一下我的游戏中是如何定义实体的,听听你的想法;例如,它是否过于冗长?
首先,一些背景:
- 实体由组件组成(基于组件的实体模型)。
- 组件可以有两种类型:属性和行为。
- 属性只是“愚蠢”的数据。它们是诸如健康,速度等之类的东西。
- 行为定义实体如何与其属性、世界、其他实体交互。
定义属性
我会一块一块地过一遍。首先,我将解释如何定义属性。在 Python 中,属性可能看起来像这样:
class Life(Attribute):
def __init__(self):
# Default values
self.health = 100
self.toxicity = 0
很基本。现在,在 XML 文件中,可以为我们定义的每个实体赋予 Attribute 中的每个字段不同的值:
<Attribute>
<Name>life</Name>
<Class>hero.attributes.Life</Class>
<Field>
<Name>health</Name>
<Value>100</Value>
</Field>
<Field>
<Name>toxicity</Name>
<Value>78</Value>
</Field>
</Attribute>
Name
— 属性的标识符(有点像 Python 中的对象)。当我们定义行为时会很有用。Class
— 该属性的 Python 类。Field
— 属性的一个字段。Field.Name
— 必须与 Python 字段相同('self.health' → 'health')。Field.Value
— 该字段的值。
定义行为
正如我之前所说,行为与实体的属性交互。比如下面的伤害行为需要了解生命属性。
class Damage(Behavior):
def __init__(self):
self.life = None
设置 Behavior 的 XML 代码与 Attribute 类似,但不相同:
<Behavior>
<Class>hero.behaviors.Damage</Class>
<Attribute>
<Field>life</Field>
<Link>life</Link>
</Attribute>
</Behavior>
Class
— 行为的 Python 类;Attribute.Field
— 行为的字段,其中要放置对属性的引用Attribute.Link
— 链接到什么属性。必须是上面定义的属性的名称标签中的值之一。