2017-05-04 4 views
0

私はエンティティ/コンポーネントシステムを作っています。継承されたコンポーネントに基づいてエンティティを選択できる関数を作るのにいくつか問題があります。のは、例を見てみましょう:継承システムをブラウズするには?

Animal (1) 
    Dog (2) 
     Doberman (3) 
     Rottweiler (3) 
    Cat (2) 
     Siamese (3) 
     Persian (3) 

あなたは、エンティティコンポーネントシステムに慣れていない場合は、のは、私が「レックス」という名前のドーベルマンをしたい場合は、私のようなものだろうと言ってみましょう:

let Rex: Entity = createEntity("Doberman"); 

DobermanコンポーネントはDogに拡張され、DogはAnimalに拡張されます。だからRexはこれらの3つのコンポーネントすべての特性を受け取ります。

ここで、Animalコンポーネント(つまり「selectEntities(Animal)」)を持つすべてのエンティティを選択する場合は、Dogs、Cats、Dobermansなども選択します。つまり、すべて継承したコンポーネントです。そして、それは動的なものでなければならず、継承されたコンポーネントの連鎖を考慮に入れる必要があります。私の最初のバージョンでは、コンポーネントは他のコンポーネントの1つだけ継承することができました。単純なループは、すべてのエンティティを参照する簡単なソリューションでした。

特定のコンポーネントはまだ1つの他のコンポーネント(Dog to Animal)にしか拡張できませんが、無限の数のコンポーネント(DobermanとRottweilerのDog)によって拡張できます。そして、私は親からすべてのコンポーネントを取得する方法を理解することはできません。それは単なるループの組み込み/インターロックで可能ですか?

ありがとうございました。

答えて

0

私は元の問題を誤解しました。問題は「ネストされたオブジェクトをどのように反復するか」でした。これには簡単な解決策があります:再帰呼び出し。だろう

public getInheritedComponents(component: string) : object { 
    let inheritees: object = {}; 
    let current : Component = this.getComponent(component); 
    for (let inheritee in current.inherited) { 
     inheritees[inheritee] = current.inherited[inheritee]; 
     let subinheritees = this.getInheritedComponents(inheritee); 
     for (let subinheritee in subinheritees) { 
      inheritees[subinheritee] = subinheritees[subinheritee]; 
     } 
    } 
    return inheritees; 
} 

そして、その日のレッスン:

だから我々はそのような何かができる「、夕暮れ時に論理的な問題と戦う夜のパスを聞かせてはいけません」 :)

関連する問題