这个实体定义模型是否过于冗长?

时间:2011-09-10 22:06:10

标签: python xml verbosity

我正在开发视频游戏,我希望它是高度可修改的。目前,我的所有游戏逻辑都是用Python定义的,我的引擎逻辑是用C ++定义的,我的数据是用XML定义的。我想向您解释如何在我的游戏中定义一个实体并听取您的想法;例如,它是否过于冗长?

首先,一些背景知识:

  • 实体由组件(基于组件的实体模型)组成。
  • 组件可以有两种类型:属性和行为。
  • 属性只是'哑'数据。它们就像健康,速度等。
  • 行为定义实体如何与其属性,世界,其他实体进行交互。

定义属性

我会逐一讨论这件事。首先,我将解释如何定义属性。在Python中,Attribute可能看起来像这样:

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 - 此字段的值。

定义行为

正如我之前所说,行为与实体的属性相互作用。例如,下面的 Damage 行为需要了解生活属性。

class Damage(Behavior):
    def __init__(self):
        self.life = None

用于设置行为的XML代码类似于属性,但不相同:

<Behavior>
    <Class>hero.behaviors.Damage</Class>
    <Attribute>
        <Field>life</Field>
        <Link>life</Link>
    </Attribute>
</Behavior>
  • Class - 行为的Python类;
  • Attribute.Field - 要放置对属性的引用的行为字段
  • Attribute.Link - 要链接的属性。必须是上面定义的属性的 Name 标记中的值之一。

1 个答案:

答案 0 :(得分: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)