Dies ist eine sehr grobe Skizze, wie ich die Dinge derzeit entworfen habe. Es sollte zumindest eine Vorstellung davon geben, wie mein ECS derzeit aufgebaut ist.
Wenn Sie in diesem Diagramm bemerken, habe ich das HUD grundsätzlich aus dem ECS aufgeteilt. Sie haben ihre eigenen Dinge (HudLayer, HudComponent usw.) und werden unterschiedlich behandelt. Hier kämpfe ich allerdings.
Es gibt viele verschiedene Fälle, in denen das HUD über Entitäten Bescheid wissen muss. Nicht nur Daten ändern (ich habe einen Event-Dispatcher dafür), sondern auch die eigentliche Entität und alles, was sie umfasst. Es gibt auch Situationen, in denen Entitäten in der Lage sein müssen, das HUD nach Daten abzufragen. Nehmen wir ein paar Beispiele:
Zuerst mein Gerätebildschirm. Hier kann ich die Ausrüstung eines Charakters (Entität) ändern. Dazu muss ich über die Entität Bescheid wissen. Zumindest glaube ich das? Wie kann ich damit umgehen?
Das zweite Szenario beinhaltet, dass meine Systeme eine HudComponent nach Daten abfragen müssen. Ein konkretes Beispiel wäre mein Kampfsystem. Jedes "Team" erhält ein 3x3-Raster, in dem es sich bewegen kann. Siehe hier:
Fähigkeiten zielen auf diese Zellen ab und nicht auf den Spieler. Daher würde ich für meine Systeme eine Möglichkeit benötigen, um festzustellen, welche Zellen belegt sind und welche nicht. Grundsätzlich brauche ich einen Weg für die bidirektionale Kommunikation zwischen Systemen und meinem HUD. Ich weiß, dass es (sowieso von einigen Leuten) empfohlen wird, Ihr HUD aus dem ECS zu entfernen. Ist das in meinem Fall angemessen?
quelle
Antworten:
Mir scheint, Sie mischen die visuelle Darstellung mit der logischen Darstellung dessen, was Sie erstellen möchten. Lassen Sie uns Ihre beiden Szenarien diskutieren.
Gerätebildschirm
In dieser Situation hätte ich einfach die Geräte-Benutzeroberfläche in der Lage, das Inventarsystem für den aktuellen Spieler abzufragen. Auf diese Weise können das Inventarsystem und seine Verwaltung in Ihrem ECS-Framework verbleiben, und Sie ermöglichen dem UI-System lediglich die Möglichkeit, das Inventarsystem nach dem Inhalt zu fragen und die Daten für den Benutzer visuell darzustellen. Wenn Benutzer Gegenstände in ihren Taschen bewegen, rufen die Taschen einfach Methoden im Inventarsystem auf, die die Komponenten entsprechend manipulieren. Auf diese Weise weiß der Bildschirm der Geräte-Benutzeroberfläche wirklich nichts über das ECS. Es enthält lediglich einen Verweis auf eine Klasse, die eine Inventory System-Schnittstelle implementiert, und kann über diese Instanz die Informationen abrufen, die zum Zeichnen selbst erforderlich sind.
Battle Screen
Ich glaube, dieses Szenario folgt wieder einer ähnlichen Prämisse. Sie können die Komponenten-, Entitäts- und Logikaspekte des Kampfsystems leicht in einen
BattleSystem
Teil Ihres ECS abstrahieren . Dieses System implementiert erneut eine bestimmte Schnittstelle, die den Vertrag zwischen der Benutzeroberfläche und dem System definiert. Wenn ein Benutzer eine UI-Aktion ausführt, ruft die UI einfach die entsprechende Methode in der aufBattleSystem
und die Interaktionen auf, die zwischen ihr, Entitäten und Komponenten stattfinden müssen.Eine Sache, die ich in beiden Fällen anstreben würde, ist, dass alle Informationen, die sich so anfühlen, als ob sie von der Subsystemabstraktion zur Benutzeroberfläche gelangen, in das System übertragen werden sollten. Die Benutzeroberfläche sollte so gestaltet sein, dass diese Werte möglicherweise im System angepasst werden können und die Benutzeroberfläche entsprechend angepasst wird. Zum Beispiel die
BattleSystem
vielleicht eine Methode, die Ihnen sagt, dass die Rastergröße 3x3 ist, aber in einer späteren Version entscheiden Sie, dass es 4x4 oder 5x5 sein soll. Indem dies datengesteuert wird, kümmert sich die Benutzeroberfläche nicht mehr unbedingt darum und passt sich nur noch an, sodass die Benutzeroberfläche wirklich so weit wie möglich von der Logik und Implementierung des Systems entkoppelt werden kann.Der Schlüssel zum Mitnehmen ist, dass Sie nicht zögern, ein System oder Systeme auf einer Ebene zu entwerfen und diese Systeme dann auf einer höheren Ebene in ein größeres System zu packen, bis Sie die Ebene der Abstraktion und Generalisierung erreicht haben, die Sie benötigen, um die Dinge zu behalten auf ihren jeweiligen Ebenen entkoppelt, aber über Schichtgrenzen hinweg kohäsiv genug, ohne das Design zu beeinträchtigen.
quelle
Sie
HudLayer
könnten ein System enthalten,HUDSystem
in dem Ihre Entitäten schließlich ihre Komponenten registrieren. DerHUDSystem
kann dann Änderungen von den registrierten Entitäten verfolgen.quelle
Sie sind auf dem richtigen Weg, um das HUD aus dem ECS herauszuhalten. HUDs und Spielbildschirme profitieren im Allgemeinen stark von der Vererbung, da der Spielfluss im Wesentlichen ein Baum ist, in dem Sie auf verschiedene Pfade verzweigen oder auf eine Weise zurückverfolgen können, die für den Spieler sinnvoll ist. Ich benutze eine Variation des Zustandsmusters, wo
HudLayer und GameScene können jedoch (im programmatischen Sinne) zu demselben Objekttyp zusammengefasst werden. Ich betrachte HUDs auch als GameScenes, da sie Entitäten und eine Update-> Anzeigeschleife enthalten können, die möglicherweise auf Benutzereingaben warten. Entitäten in HUDs sind Hintergrund, Symbole und Text, ähnlich wie Charaktere und Hintergründe auf dem Kampfbildschirm Entitäten sind, die aus Grafiken und Orten bestehen. Während dies bedeutet, dass HUDs Elemente enthalten, die Teil des ECS sind, befinden sich die HUD-Bildschirme selbst nicht im ECS.
Zurück zur Vererbung: Wenn der Kampfbildschirm als die primäre GameScene betrachtet wird, die aktiv ist, können alle Bildschirm-HUDs und -Menüs untergeordnete Bildschirme des Kampfbildschirms sein. Wenn Sie den Inventarbildschirm über den Kampfbildschirm öffnen, nimmt der Kampfbildschirm keine Eingaben mehr an und erstellt den Inventarbildschirm. Der Kampfbildschirm verfolgt den aktiven Charakter und die Zelle, in der er sich befindet, und alle charakterspezifischen Menüs werden mit diesen Informationen geladen. Nachdem Sie eine Auswahl getroffen und das Menü geschlossen haben, wird ein auf der Auswahl basierender Wert an das übergeordnete Element, den Kampfbildschirm, zurückgegeben, und das ECS sorgt dafür, dass die Charaktereinheit angemessen reagiert.
quelle