Ich versuche, ein komponentenbasiertes Entitätssystem für Lernzwecke zu entwerfen (und später für einige Spiele zu verwenden), und ich habe einige Probleme beim Aktualisieren von Entitätszuständen.
Ich möchte keine update () -Methode in der Komponente haben, um Abhängigkeiten zwischen Komponenten zu vermeiden.
Was ich derzeit im Sinn habe, ist, dass Komponenten Daten enthalten und Systemaktualisierungskomponenten.
Wenn ich also ein einfaches 2D-Spiel mit einigen Entitäten (z. B. Spieler, Feind1, Feind2) habe, die Transformations-, Bewegungs-, Status-, Animations- und Rendering-Komponenten enthalten, sollte ich Folgendes haben:
- Ein Bewegungssystem, das alle Bewegungskomponenten verschiebt und die Statuskomponenten aktualisiert
- Und ein RenderSystem, das die Animationskomponenten aktualisiert (die Animationskomponente sollte eine Animation (dh eine Reihe von Frames / Texturen) für jeden Status haben und diese aktualisieren, bedeutet, dass die Animation ausgewählt wird, die dem aktuellen Status entspricht (z. B. Springen, Bewegen_Links usw.) Aktualisierung des Frame-Index). Anschließend aktualisiert das RenderSystem die Renderkomponenten mit der Textur, die dem aktuellen Frame der Animation jeder Entität entspricht, und rendert alles auf dem Bildschirm.
Ich habe einige Implementierungen wie das Artemis-Framework gesehen, weiß aber nicht, wie ich diese Situation lösen soll:
Nehmen wir an, mein Spiel hat die folgenden Entitäten. Jede Entität hat eine Reihe von Zuständen und eine Animation für jeden Zustand:
- Spieler: "Leerlauf", "Moving_right", "Springen"
- feind1: "bewegung_auf", "bewegung_abwärts"
- Feind2: "Moving_Left", "Moving_Right"
Was sind die am meisten akzeptierten Ansätze, um den aktuellen Status jeder Entität zu aktualisieren? Das einzige, was ich mir vorstellen kann, sind separate Systeme für jede Gruppe von Entitäten und separate Status- und Animationskomponenten, sodass ich PlayerState, PlayerAnimation, Enemy1State, Enemy1Animation ... PlayerMovementSystem, PlayerRenderingSystem ... hätte, aber ich denke, das ist schlecht Lösung und bricht den Zweck eines komponentenbasierten Systems.
Wie Sie sehen können, bin ich hier ziemlich verloren, daher würde ich mich über jede Hilfe sehr freuen.
EDIT: Ich denke, die Lösung, um diese Arbeit so zu machen, wie ich es beabsichtige, ist folgende:
Sie machen statecomponent und animationcomponent generisch genug, um für alle Entitäten verwendet zu werden. Die darin enthaltenen Daten sind der Modifikator für Änderungen, z. B. welche Animationen abgespielt werden oder welche Zustände verfügbar sind. - Byte56
Jetzt versuche ich herauszufinden, wie diese beiden Komponenten generisch genug gestaltet werden, damit ich sie wiederverwenden kann. Könnte es eine gute Lösung sein, für jeden Zustand eine UID zu haben (z. B. Gehen, Laufen ...) und Animationen in einer Karte in der Animationskomponente zu speichern, die mit dieser Kennung versehen ist?
statecomponent
und animationcomponent
generisch genug, um für alle Entitäten verwendet zu werden. Die darin enthaltenen Daten sind der Modifikator für Änderungen, z. B. welche Animationen abgespielt werden oder welche Zustände verfügbar sind.