2011-09-10 22 views
1

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

首先,一些背景:

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

定义的属性

我过去这一块一块的。首先我将解释如何定义属性。在Python和属性可能看起来像这样:

class Life(Attribute): 
    def __init__(self): 
     # Default values 
     self.health = 100 
     self.toxicity = 0 

很基本。现在,在XML文件中,在属性的每个字段可被赋予不同的值,我们定义每个实体:

<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 

用于建立行为的XML代码类似于一个属性的,但不相同的:

<Behavior> 
    <Class>hero.behaviors.Damage</Class> 
    <Attribute> 
     <Field>life</Field> 
     <Link>life</Link> 
    </Attribute> 
</Behavior> 
  • Class — Python类的行为;
  • Attribute.Field —的行为,其中参考属性将被放置
  • Attribute.Link —什么属性链接到的领域。必须是名称上面定义的属性的标签中的值之一。
+0

我不太明白你的问题。你想从XML定义创建Python代码吗?如果不是,那么用于XML代码的是什么? – Nikratio

+0

@Nikratio我只想知道这种定义实体的方式是否足够清晰,但是如果您认为它过于冗长或者过于冗长。 –

+0

你为什么要用XML而不是类属性来做这件事?类属性不会太冗长,更易于阅读。至少我这么认为。 –

回答

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'} 

而对于字典转换回JSON,

attr=json.dumps(attribute) 
+0

JSON看起来非常整齐。我可以削减很多脂肪,而不是文件看起来好多了。 –