2011-09-10 25 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看起來非常整齊。我可以削減很多脂肪,而不是文件看起來好多了。 –