Ich bin ziemlich neu in der Spieleentwicklung (aber nicht in der Programmierung) und ich versuche herauszufinden, wie ich am besten mit der Kommunikation zwischen den Welten umgehen kann. Was ich meine ist das:
Ich habe über Entity Component Systems (ECS) gelesen und wie Leute vorschlagen, verschiedene Welten / Räume zu verwenden ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) für ein Unterabschnitt eines Spiels. Zum Beispiel erhalten ein HUD, ein Inventar oder ein Kampf / eine Bewegung jeweils eine separate Welt / einen eigenen Raum (weil sie unterschiedliche Grafiken und zugrunde liegende Logik haben.
Ich habe mich jedoch gefragt, wie das Inventar oder das HUD über die Gesundheit eines Spielers Bescheid weiß, wenn die Gesundheit von einem anderen Raum / einer anderen Welt behandelt wird, beispielsweise im Kampf.
Dies gilt auch für den Spielfortschritt im Allgemeinen, zum Beispiel für den Dialog mit dem NPC (ein Dialog wäre ein separater Bereich, da es sich um einen Popup-Bildschirm handelt). Wie würden Sie jedoch die im Dialog (oder im Status des Dialogs) getroffenen Entscheidungen auf andere Bereiche / Welten übertragen? . Oder im Grunde jede andere Art von Ereignis, die den Spielverlauf in verschiedenen Räumen / Welten beeinflusst (Gesundheit, Mana, Quests, Dialog, Kampf, Inventar, Hud usw.).
Wie würde man mit dieser Art von Design umgehen? Benötigt es ein (in der Implementierung) Singleton-Objekt, das alle diese Informationen enthält? Das wäre seltsam, weil dann die components
Notwendigkeit besteht, jede Änderung an diesem Singleton-Objekt zu übermitteln, das sich anfühlt, als würde man Dinge zweimal tun (gegen den Haupt-DRY der Programmierung) ...
Ich bin hier irgendwie ratlos in Bezug auf Design, irgendwelche Hinweise?
---BEARBEITEN---
Ich habe ein paar andere Beiträge gelesen, die von Kommentaren vorgeschlagen wurden, und eine allgemeine Vorstellung von den Möglichkeiten bekommen, aber jeder von ihnen scheint einen großen Nachteil zu haben, der sie einfach nicht richtig macht. Es ist sehr wahrscheinlich, dass ich Details überwache, die diese Nachteile lösen würden. Sie können mich also gerne korrigieren. Ich werde versuchen, einen Überblick sowie einige Antworten auf einige Fragen zu geben.
Ich sehe drei Hauptoptionen, um Daten zwischen Leerzeichen zu teilen. Obwohl es in den meisten Beiträgen um den Datenaustausch zwischen Systemen geht, kann dies meines Erachtens auch für den Datenaustausch zwischen Systemen angewendet werden.
1. Abfragen
Beispiel : Wenn die HUD-Welt den aktuellen Zustand des Spielers kennen muss, kann sie eine andere Welt abfragen und nach dem aktuellen Zustand fragen.
Nachteil : Welten müssen voneinander wissen, was ein großes Abhängigkeitsproblem darstellt und der Entkopplung entgegensteht.
2: Direktnachrichten (synchron und asynchron)
Beispiel : Wenn sich während des Kampfes die Gesundheit eines Spielers ändert, kann er Nachrichten (synchronisieren und asynchronisieren, was auch immer benötigt wird) an andere Welten senden, die über diese Änderung Bescheid wissen müssen.
Nachteil : Immer noch das Problem der Entkopplung: Welten müssen voneinander wissen.
3: Indirektes Messaging (synchronisieren und asynchronisieren) <- beste Option
Beispiel : Wenn sich die Gesundheit eines Spielers während des Kampfes ändert, kann er Nachrichten (synchron und asynchron, was auch immer benötigt wird) an den allgemeinen Nachrichten-Hub senden. Andere Welten / Systeme, die über diese Änderung Bescheid wissen müssen, abonnieren den jeweiligen Nachrichtenkanal und lesen die Nachrichten.
Oberseite : Vollständig entkoppelt, leicht handhabbar und erweiterbar.
Nachteil / unklar : Wann weiß der Nachrichtenkanal, dass die Nachrichten gelöscht werden müssen? Oder vielleicht markiert das abonnierte System (nur für sich selbst) die Nachricht als gelesen und wartet auf neue Nachrichten -> Nachrichtenbox wird nach einer Weile enorm. Wie gehen Welten / Systeme mit Ordnung um? Beispiel: Während eines Frames: Wenn das HUD die Integritätsnachricht bereits abgefragt hat und sich danach der Zustand ändert, wird das HUD im nächsten Frame aktualisiert. Für einige Anwendungen ist dies möglicherweise nicht der richtige Weg.
F: Ein einzelnes Spielobjekt kann in mehreren Feldern vorhanden sein
Ich verwende das Artemis ECS-Framework, das integrierte Räume (sogenannte Welten) enthält. Jede Entität (und damit die Daten in Form von Komponenten) wird auf einer Welt erstellt und kann daher nicht zwischen Welten geteilt werden.