Wie Code UI / HUD in Entity System?

18

Ich glaube, ich habe bereits die Idee des Entity-Systems, inspiriert von Adam Martin (t-machine), bekommen. Ich möchte dies für mein nächstes Projekt verwenden.

Ich kenne bereits die Grundlagen von Entitäten, Komponenten und Systemen. Mein Problem ist, wie man mit UI / HUD umgeht. Zum Beispiel ein Questfenster, ein Fertigkeitsfenster, ein Charakterinfofenster usw. Wie gehen Sie mit UI-Ereignissen um (z. B. Drücken einer Taste)? Dies sind Dinge, die nicht in jedem Frame verarbeitet werden müssen. Derzeit verwende ich MVC, um die Benutzeroberfläche zu codieren, aber ich glaube nicht, dass dies mit Entity System kompatibel ist.

Ich habe gelesen, dass Entity System in ein größeres OOP eingebettet ist. Ich weiß nicht, ob sich die Benutzeroberfläche außerhalb von ES befindet oder nicht. Wie gehe ich damit um?

Sylpheed
quelle

Antworten:

17

Vielleicht denken Sie zu viel in Entitätssystemen. Entitäten sind dazu gedacht, Objekte im Spiel zu erfassen, wie Charaktere, Feinde, Skripte, Kugeln, Auslöser usw.

Vielleicht ist es viel besser und einfacher, wenn Sie Ihre Benutzeroberfläche trennen. Sie müssen nicht ALLES innerhalb des Gültigkeitsbereichs der Entitäten vornehmen.

Gustavo Maciel
quelle
Dies sagt auch Adam Martin in einem seiner Beiträge oder Kommentare zu t-machine. Die ES ist eine Lösung für ein bestimmtes Problem. Es kann und sollte zusammen mit "traditionelleren" Lösungen für andere Aspekte des Spiels (Engine) verwendet werden.
user8363
Vielen Dank. Ich bin mir nur nicht sicher, was in ES sein soll. Wie codieren Sie eine effektive Benutzeroberfläche? Ich denke, MVC schafft das nicht, weil ich Probleme mit der Hierarchie habe.
Sylpheed
Ich sehe, dass Sie damit einverstanden sind, eine andere Architektur für die Benutzeroberfläche zu verwenden. Was ist dann das Problem mit MVC?
Narek
@Armen MVC hat keine Probleme, aber das Einfügen in den Entitätsbereich hat es. Es ist nur so, dass seine Vorteile seine Nachteile nicht schlagen werden. Es ist nicht nötig, ein Architektur-Astronaut zu sein
Gustavo Maciel
3

Obwohl ich denke, dass eine Benutzeroberfläche für Entitäten / Komponenten funktionieren könnte, wäre es schwierig, dies zu tun. Außerdem ist es weit genug von den Komponenten und Systemen entfernt, die Sie für die Verarbeitung Ihrer Spielelemente benötigen. Es wäre im Grunde genommen nur ein anderes Element- / Komponentensystem in Ihrem Spiel. Ich kann mir nicht vorstellen, dass es eine große Überschneidung zwischen den beiden geben würde.

Entitätssysteme sind fantastisch und es kann verlockend sein, sie überall zu verwenden. Wenn Sie einen wirklich süßen Hammer bekommen, sind Sie schließlich versucht, all Ihre Probleme wie Nägel zu behandeln. Das EC-System ist jedoch nur ein weiteres Werkzeug in Ihrer Programmiertasche. Für die Probleme, mit denen es gelöst wird, funktioniert es sehr gut, aber Sie haben bessere Tools für Probleme wie die Benutzeroberfläche.

Die Vererbungsstruktur funktioniert sehr gut für GUIs. Nicht nur zum Erstellen der UI-Komponenten, sondern auch zum Layouten. Es ist wirklich schön, dass UI-Komponenten untergeordnete Komponenten anderer Komponenten sind, damit sie Eigenschaften wie Position, Skalierung und Deckkraft erben können. Wenn Sie versuchen würden, dies mit einem EC-System einzurichten, müssten Sie einige Regeln des EC-Systems brechen.

MichaelHouse
quelle
1

Sie können eine neue Schnittstellenfunktion erstellen, die immer dann aufgerufen wird, wenn UI / HUD gezeichnet wird, und benutzerdefinierten / skriptbasierten Komponenten die Implementierung dieser Funktion ermöglichen. Dies erfordert ein IMGUI-System (es gibt viele Tutorials in Google, dies ist nur die Originalpräsentation), um verwendet zu werden. Damit können Sie Fenster als Entitäten erstellen, in denen Sie Ihre eigene UI-Erstellungskomponente und eine Fensterrahmen-Rendererkomponente haben.

Da dies nicht bei jedem Frame verarbeitet wird, können Sie die gesamte Benutzeroberfläche in einem anderen Puffer rendern, der nur bei allen Arten von Eingabe- / Datenereignissen aktualisiert wird. Das heißt, jedes Mal, wenn ein Ereignis empfangen wird, ändert es eine Variable, um anzuzeigen, dass das Fenster im nächsten Frame neu gezeichnet werden muss. Wenn diese Variable wahr ist, wird sie auf falsch gesetzt und anschließend werden Benutzeroberflächen aufgerufen. Wenn Sie Animationen wünschen, ist es wichtig, dass Sie genau diese Reihenfolge der Vorgänge verwenden, damit die Benutzeroberfläche selbst ein Repaint für das nächste Bild auslösen kann.

Schlange5
quelle