2012-01-22 10 views
2

小さなゲームフレームワーク用のエンティティコンポーネントシステム用の単純なエンティティマネージャを作成しています。私のエンティティマネージャクラスは、エンティティに割り当てられたコンポーネント(単純なデータストアオブジェクト)(IDプロパティ以上の単純な最終オブジェクト)を処理します。また、これらのエンティティに関連付けられたタグとグループを(文字列として)処理します。複雑なデータ構造からオブジェクトのインスタンスをすべて削除する

private Map<String, Entity> tags = new HashMap<String, Entity>(); 

private Map<String, List<Entity>> groups = new HashMap<String, List<Entity>>(); 

private Map<Class<? extends Component>, Map<Entity, Component>> components = new HashMap<Class<? extends Component>, Map<Entity, Component>>(); 

この方法で、私は非常に迅速にハッシュマップからコンポーネントの特定のtypeですべてのエンティティを取得することができます。

は、私は次のように記載されているデータを持っています。他の2人にも同じことが言えます。

問題は、エンティティをシステムから完全に削除できるようにしたいということです(エンティティがここで参照を持たない場合もチェックできるため、プールに戻すことができます)が、 3つの構造すべてを反復せずにそれを行う方法を知らない。

// find if entity is in a group 
for (List<Entity> entity : groups.values()) { 
    if (entity.contains(e)) return true; 
} 

return false; 

 

// even more complex, find if entity has any behaviors 
for (Map<Entity, Component> entry : components.values()) { 
    if (entry.keySet().contains(entity)) return true; 
} 

return false; 

私はそれを使用してすることができ、より良い構造は、ルックアップの速度を犠牲にしませんあり、または実体は何の言及がなければ簡単にチェックするために、別の構造を追加する方法上記の構造では?

エンティティクラスには何も追加しません。データ自体は含まれていないはずです。

編集:ちょっと混乱を解消するために、エンティティからコンポーネントを削除することもできますが、それが単一のエンティティへの唯一の参照だった場合は削除したいと考えています。 しかし、3つの構造すべてを直線的に通らずにエンティティへの参照があるかどうかはわかりません。

+0

このコードで 'entity'を' groupEntities'にリネームすることから始めましょう: 'List entity:groups.values()' –

+1

もう一つの選択肢は、構造体に挿入/追加されたときの実体参照のリストを保持することです。基本的には、GCを書き直しているので、同じ戦略が適用されます。 –

+0

代わりに、メンバー変数 'active'を追加して、削除時にfalseに設定することもできます。あなたのコードは 'isActive'をチェックできます。それほどかわいらしくはありませんが、代わりの方法です。 –

答えて

1

あなたはそれを含むリストとマップ構造にデータ構造のマッピングに各エンティティを維持しようとすることができます

Map<Entity,List<List<Entity>> activeLists; 
// delete function 
for (List<Entity> x : activeLists.get(entity)) 
{ 
    x.remove(entity); 
} 

もう一つのアイデアは、ノードがエンティティ、グループ、タグすることができ、より一般的なグラフデータ構造を使用することです、 なんでも。次にエンティティを完全に削除することは、グラフ内のノードを削除することです。エンティティがどのグループに属しているかを照会したい場合は、そのエッジを反復してグループへのエッジを探します。

関連する問題