Angesichts von DRY erscheint es wünschenswert, eine Sammlung verwandter Spielobjekte nur in einem Container zu speichern. Möglicherweise sind jedoch Untersammlungen dieser Objekte in verschiedenen Kontexten erforderlich. Es kann sinnvoll sein, diese spezifischen Untergruppen in bestimmten, besser geeigneten Behältern aufzubewahren. Dies erhöht den Aufwand, Objekte über Container hinweg zu verfolgen, beispielsweise wenn Objekte aus der Spielwelt entfernt werden.
Welche Möglichkeiten gibt es, um ein solches Design zu vereinfachen, und was sind die typischen Kompromisse?
Um zu zeigen:
In einem Multiplayer-Rollenspiel enthält der Server möglicherweise eine Sammlung von Spielcharakteren in einer Karte, die zum Nachschlagen nach ID geeignet ist.
world
map<id, Character> allCharacters
Ein Charakter kann sich auch in einem bestimmten Spiellevel befinden. Um alle Zeichen zu identifizieren, die in einer Ebene vorhanden sind, kann es angebracht erscheinen, für jede Ebene einen Container einzuführen, der die aktuell vorhandenen Zeichen enthält. Auf diese Weise können Sie eine gemeinsame Logik für alle Zeichen in dieser Ebene ausführen.
world
map<id, Character> allCharacters
[levels]
level1
vector<Character> charactersOnPlayfield
level2
vector<Character> charactersOnPlayfield
...
Wenn ein Charakter mit der Welt interagiert, sollten Nachrichten nur an Charaktere in Reichweite weitergeleitet werden. Dieses Interessenmanagement könnte erreicht werden, indem jede Ebene in ein Raster von Zellen unterteilt wird, in denen jeweils die aktuell darauf stehenden Zeichen gespeichert sind.
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
...
...
Die Charakterobjekte auf verschiedenen Abstraktionsebenen führen dazu, dass über Objektbesitz und Lebensdauer sorgfältig nachgedacht werden muss.
Beachten Sie, dass die in den Containern gespeicherten Zeichenobjekte natürlich Referenzen und keine Kopien sind. Außerdem gehe ich davon aus, dass keine Speicherbereinigung vorhanden ist.