Ich bin immer noch grün zu Entity / Component-Systemen. Ich finde, da ich nützliche Komponenten zum Zeichnen von Sprites (oder Spritesheets) und zum Handhaben von Eingaben (Maus- / Touch-Klicks) habe, möchte ich diese natürlich wiederverwenden, um UI-Komponenten (wie Schaltflächen, z. B. Ebenenauswahlbildschirm) zu erstellen.
Das kommt mir sehr merkwürdig vor. Ich verstand Entitäten immer als "Spielmodell" wie Spieler, Feinde, Power-Ups usw. Andererseits ist es aus Sicht der Wiederverwendung von Code durchaus sinnvoll, Komponenten für die Benutzeroberfläche wiederzuverwenden.
Wie (und wo) passen UI / GUI-Bedenken in ein Entitäts- / Komponentensystem?
(Hinweis: Diese Frage ist plattformunabhängig, da sie für mehrere Plattformen / Sprachen gilt.)
quelle
Antworten:
Nachdem ich mehrere Entity-Component-Systeme, insbesondere CraftyJS, verwendet hatte, erhielt ich mehr oder weniger die Antwort auf meine Frage: Ja, Sie können Komponenten (insbesondere Sprites oder Bilder und Mausklick-Handler in 2D-Spielen) für die GUI wiederverwenden.
In den meisten Fällen haben Sie nur Zugriff auf das ECS und nicht auf die zugrunde liegenden Systeme (z. B. Zeichensystem). In diesem Fall ist es in Ordnung, Komponenten zu verwenden, da Sie keine andere Wahl haben.
Wenn Sie Zugriff auf das zugrunde liegende System haben (z. B. Ruby Roguelike mit direktem Zugriff auf Curses), ist das Zeichnen / Rendern direkt auf diesem System möglicherweise effektiver (weniger Code, weniger zerbrechlich, natürlicher) als die Verwendung einer Reihe von Entitäten und Komponenten.
quelle
In 2D oder 3D sollte ein Entity Component System (ECS) mindestens Zugriff auf das GUI-System haben, wenn es nicht Teil desselben ECS ist.
Persönlich würde ich die beiden nicht mischen. Die Wiederverwendbarkeit von Code für eine GUI geschieht wirklich nur auf oberster Ebene. Antworten auf Maus / Tastatur, Rendern usw. Die Funktionen der verschiedenen Schaltflächen oder die Informationen, die in bestimmten Listen angezeigt werden, können nicht generisch genug gestaltet werden, um sie wiederzuverwenden.
Zum Beispiel würde ich mir vorstellen, dass die Komponenten für GUI-Entitäten so ähnlich
position
sind wierender
undgui
. Wo die GUI-Komponente die Art der Aktion definieren würde, die die GUI-Entität ausführt. Diese Aktion wird jedoch ziemlich einzigartig und kontextspezifisch sein. Dies führt dazu, dass das System, das GUI-Komponenten verarbeitet, sehr groß ist und im Wesentlichen für die einzelnen GUI-Funktionen (Laden des Spiels, Speichern des Spiels, Suchen des Servers usw.) ausgelegt ist. Klingt unordentlich.Ich würde es vorziehen, eine Standardklassendatei für jeden GUI "Bildschirm" zu erstellen. Haben Sie alle Funktionen für diesen Bildschirm an einem Ort (mit Verweisen auf eine gemeinsame Funktionsklasse). Es ist viel ordentlicher und einfacher zu handhaben.
Wie gesagt, das ECS sollte jedoch Zugriff auf das GUI-System haben. Es muss in der Lage sein, Informationen basierend auf Entitäten in seinen Systemen an die GUI zu liefern. Wenn Sie zum Beispiel über eine verbündete Einheit fahren, wird ein GUI-Fenster mit allen Informationen zu dieser Einheit geöffnet. Wenn Sie über einer feindlichen Einheit schweben, wird ein GUI-Fenster mit begrenzten Informationen geöffnet. Sie möchten die GUI wahrscheinlich nicht so programmieren, dass sie den Unterschied zwischen beiden erkennt. Sie möchten die Entität auffordern, ihre Informationen anzuzeigen.
Entitäten werden also wahrscheinlich immer noch eine Art GUI-Komponente haben, aber sie werden Entitäten "im Spiel" sein, keine GUI-Entitäten. Diese Komponente verwendet das externe GUI-System, um ihre GUI-Schnittstelle zu erstellen.
quelle
TouchButton
die, die sich aus einem Spritesheet und einem Touch-Click-Listener zusammensetzen. Für das Unit-Popup würde ich das wahrscheinlich als Kombination aus Sprite-Komponente + Mouse-Listener-Komponente implementieren. Hmm.