Ich habe einige Probleme damit, herauszufinden, wie ich mit der staatlichen Verwaltung in meinen Einheiten umgehen soll.
Ich habe keine Probleme mit der Verwaltung des Spielstatus, wie Pause und Menüs, da diese nicht als Entitätskomponentensystem behandelt werden. nur mit Zustand in Entitäten / Komponenten.
Als Beispiel für Orcs Must Die habe ich meine MainCharacter- und Trap-Entitäten, deren Komponenten nur PositionComponent, RenderComponent, PhysicsComponent sind.
Bei jedem Update ruft die Entität das Update ihrer Komponenten auf. Ich habe auch einen generischen EventManager mit Listenern für verschiedene Ereignistypen.
Jetzt muss ich in der Lage sein, die Fallen zu platzieren: Wählen Sie zuerst die Falle und die Position der Falle aus und platzieren Sie dann die Falle.
Wenn Sie eine Falle platzieren, sollte sie vor dem MainCharacter erscheinen, auf andere Weise gerendert werden und ihm folgen. Wenn es platziert ist, sollte es nur auf Kollisionen reagieren und auf normale Weise gerendert werden.
Wie wird dies normalerweise in komponentenbasierten Systemen gehandhabt?
(Dieses Beispiel ist spezifisch, kann jedoch dazu beitragen, den allgemeinen Umgang mit Entitätszuständen herauszufinden.)
quelle
Antworten:
Eine interessante Anwendung eines Komponentensystems besteht darin, dass Sie die Komponenten einer Entität zur Laufzeit ändern können, wenn Sie sie so konzipiert haben, dass sie solche verarbeiten können. Der Zustand einer Entität wird somit zur Summe sowohl der ihr zugewiesenen Komponenten als auch der Werte, die diese enthalten.
In Ihrem Beispiel können Sie zuerst die Falle mit a
BuildControllerComponent
(die die Reaktion auf Spielersteuerungen in der Erstellungsphase regelt), aPositionComponent
und a erstellenRenderComponent
. Das letzte hat ein Datenfeld, das die verwendeten Pixel-Shader steuert, und eines davon verleiht der zu erstellenden Falle ein "gespenstisches" Aussehen. Sie werden feststellen, dass noch keine Physikkomponenten zugewiesen sind.Beim Platzieren der Falle werden die Komponenten ausgetauscht. Das
BuildControllerComponent
wird nicht mehr benötigt, daher wird es entfernt. DieRenderComponent
Shader des werden durch Ihre normale Standardansicht der Falle ersetzt. Schließlich wirdPhysicsComponent
der Entität alles hinzugefügt, was für die Funktion der Falle erforderlich ist.Bei einem vererbungsbasierten Ansatz entspricht dies einem Konstruktor für eine
ActiveTrapEntity
Klasse, der eineBuildTimeTrapEntity
Klasse als Argumente verwendet. Der zweite wird zum Rendern der Falle während des Erstellens verwendet, der erste wird für die Falle verwendet, nachdem sie vorhanden ist .quelle
BuildControllerComponent
?" oder "Wie ist die Position dieses UnternehmensPositionComponent
, wenn es welche hat?" - diejenigen, die Sie tun, indem Sie die Komponentenliste auf diejenigen überprüfen, an denen Sie interessiert sind, und optional (einige) ihrer Werte abfragen.BuildControllerComponent
s verbunden ist. Es muss bereits die Blickwinkeländerungen des Spielercharakters (oder der Kamera) sowie Ereignisse beim Drücken von Tasten und Mäusen verarbeiten.Ich mag die Idee nicht, dass Entitäten Updates für ihre Komponenten aufrufen (Systeme sollten die Arbeit erledigen), und das wird zu Problemen führen, wenn Komponenten sich nicht gegenseitig bewusst sind.
Sie können eine zusätzliche Komponente namens "Status" hinzufügen. Auf Ihre Render- und Kollisionssysteme wird zugegriffen. Die Statuskomponente ist nur ein Flag, für das mehrere Status verfügbar sind. Für die Situation, die Sie beschreiben, wären die Zustände
Play
undBuild
. Wenn das Render-System erkennt, dass der StatusBuild
vorliegt, wird das Objekt durchscheinend gezeichnet. Wenn das Kollisionssystem denBuild
Status sieht , verarbeitet es keine Kollisionen mit dem Spieler.Aber wirklich, wenn Sie keine Systeme haben und sich auf Komponenten verlassen, um die ganze Arbeit zu erledigen, werden Sie auf viele Probleme stoßen. Komponenten sollten nichts voneinander wissen und keine Verarbeitung durchführen.
quelle
StateComponent
, das von mehreren Systemen genutzt werden kann.