私はビデオ ゲームを開発していますが、高度に変更可能にしたいと考えています。現在、すべてのゲーム ロジックは Python で、エンジン ロジックは C++ で、データは XML で定義されています。私のゲームでエンティティがどのように定義されているかを説明し、あなたの意見を聞きたいと思います。たとえば、冗長すぎませんか。
まず、いくつかの背景:
- エンティティはコンポーネントから作成されます (コンポーネント ベースのエンティティ モデル)。
- コンポーネントには、属性と動作の 2 つのタイプがあります。
- 属性は単なる「ダム」データです。それらは、健康、速度などです。
- 動作は、エンティティがその属性、世界、他のエンティティとどのように相互作用するかを定義します。
属性の定義
これを少しずつ見ていきます。まず、属性の定義方法について説明します。Python では、Attribute は次のようになります。
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
Behavior を設定するための XML コードは、Attribute のコードと似ていますが、同一ではありません。
<Behavior>
<Class>hero.behaviors.Damage</Class>
<Attribute>
<Field>life</Field>
<Link>life</Link>
</Attribute>
</Behavior>
Class
— 動作の Python クラス。Attribute.Field
— 属性への参照が配置される動作のフィールドAttribute.Link
— どの属性にリンクするか。上で定義した属性のNameタグの値の 1 つでなければなりません。