光でDRY、それだけで一つの容器に関連したゲームオブジェクトのコレクションを格納するのが望ましいと思われます。ただし、さまざまなコンテキストでこれらのオブジェクトのサブコレクションが必要になる場合があります。これらの特定のサブセットを特定のより適切なコンテナに保存するのが賢明な場合があります。これにより、たとえばオブジェクトがゲームの世界から削除された場合など、コンテナー全体でオブジェクトを追跡する作業が増加します。
そのような設計を単純化する可能性は何ですか?そして典型的なトレードオフは何ですか?
説明する:
マルチプレーヤーロールプレイングゲームでは、サーバーは、IDによる検索に適したマップにゲームキャラクターのコレクションを保持する場合があります。
world
map<id, Character> allCharacters
キャラクターは特定のゲームレベルに常駐することもあります。レベルに存在するすべての文字を識別するために、現在そのレベルに存在する文字を保持する各レベルのコンテナを導入することが適切に思えるかもしれません。このようにして、そのレベルのすべてのキャラクターに共通のロジックを実行できます。
world
map<id, Character> allCharacters
[levels]
level1
vector<Character> charactersOnPlayfield
level2
vector<Character> charactersOnPlayfield
...
さらに進んで、キャラクターがワールドと対話するとき、メッセージは範囲内のキャラクターにのみルーティングされるべきです。このインタレスト管理は、各レベルをセルのグリッドに分割することによって達成できます。各セルは、現在その上に立っているキャラクターを格納します。
world
map<id, Character> allCharacters
[levels]
level1
vector<Character> charactersOnPlayfield
[cells]
cell1
vector<Character> charactersOnCell
cell2
vector<Character> charactersOnCell
...
level2
vector<Character> charactersOnPlayfield
[cells]
cell1
vector<Character> charactersOnCell
cell2
vector<Character> charactersOnCell
...
...
抽象化のさまざまなレベルにあるCharacterオブジェクトは、オブジェクトの所有権と寿命について注意深く考える必要性をもたらします。
コンテナに格納されているCharacterオブジェクトは当然、コピーではなく参照になることに注意してください。また、ガベージコレクションは行われていないと想定しています。