1

我正在开发视频游戏,我希望它具有高度可修改性。目前,我所有的游戏逻辑都是用 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— 链接到什么属性。必须是上面定义的属性的名称标签中的值之一。
4

1 回答 1

1

您是否考虑过使用json而不是 XML?它不那么冗长,更具可读性,并且可以转换为现成的 Python 数据结构:

例如:

import json

x='''{"Field": [{"Name": "health", "Value": 100}, {"Name": "toxicity", "Value": 78}],
    "Name": "life",
    "Class": "hero.attributes.Life"}'''

attribute=json.loads(x)

# {u'Class': u'hero.attributes.Life',
#  u'Field': [{u'Name': u'health', u'Value': 100},
#             {u'Name': u'toxicity', u'Value': 78}],
#  u'Name': u'life'}

并将dict转换回json,

attr=json.dumps(attribute)
于 2011-09-10T22:18:15.187 回答