EDIT: Um genau zu klären, was meine Frage ist: Ist dies eine gute Möglichkeit, Animationen / Animationsstatus in einer Game-Engine mit Blick auf die Erstellung / Verwaltung von Inhalten zu behandeln? Was sind die Fehler bei dieser Vorgehensweise und was wäre eine alternative Vorgehensweise? - Obwohl meine Antwort teilweise in den Kommentaren beantwortet wurde, scheint es der richtige Weg zu sein.
Ich versuche, Animationen in einem 2D-Game-Engine- Hobbyprojekt zu verarbeiten, ohne sie hart zu codieren. Hartcodierte Animationszustände scheinen mir ein weit verbreitetes, aber sehr merkwürdiges Phänomen zu sein.
Ein kleiner Hintergrund: Ich arbeite mit einem Entitätssystem, in dem Komponenten eine Menge Daten sind und Subsysteme auf sie einwirken. Ich habe mich für ein Abfragesystem entschieden, um den Animationsstatus zu aktualisieren.
Mit Animationszuständen meine ich: "walking_left", "running_left", "walking_right", "shooting", ...
Meine Idee, mit Animationen umzugehen, bestand darin, sie als datengetriebenes Modell zu entwerfen . Daten könnten in einer XML-Datei, einem RDBMS, ... gespeichert und zu Beginn eines Spiels / Levels / ... geladen werden. Auf diese Weise können Sie Animationen und Übergänge auf einfache Weise bearbeiten, ohne den Code überall in Ihrem Browser ändern zu müssen Spiel.
Als Beispiel habe ich einen XML-Entwurf der Datendefinitionen angefertigt, die ich mir vorgestellt hatte.
Ein sehr wichtiges Datenelement wäre einfach die Beschreibung einer Animation . Eine Animation hätte eine eindeutige ID (einen beschreibenden Namen). Es würde eine Referenz-ID für ein Bild enthalten (das von ihm verwendete Sprite-Sheet, da unterschiedliche Animationen möglicherweise unterschiedliche Sprite-Sheets verwenden). Die Bilder pro Sekunde, mit denen die Animation ausgeführt werden soll. Die "Wiedergabe" hier definiert, ob eine Animation einmalig oder unendlich ausgeführt werden soll. Dann habe ich eine Liste von Rechtecken als Rahmen definiert.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Animationsdaten würden in einem geladen und gehalten werden Animation Ressourcenpool und referenziert von Spiel Entitäten , die es verwenden. Es würde als eine Ressource wie ein Bild, ein Ton, eine Textur behandelt werden, ...
Das zweite zu definierende Datenelement wäre eine Zustandsmaschine, mit der Animationszustände und -übergänge verarbeitet werden können. Dies definiert, in welchem Zustand sich eine Spieleinheit befinden kann, in welche Zustände sie übergehen kann und was diese Zustandsänderung auslöst.
Diese Zustandsmaschine würde sich von Entität zu Entität unterscheiden. Weil ein Vogel die Zustände "Gehen" und "Fliegen" haben könnte, während ein Mensch nur den Zustand "Gehen" haben würde. Es könnte jedoch von verschiedenen Entitäten geteilt werden, da wahrscheinlich mehrere Menschen den gleichen Status haben (insbesondere wenn Sie einige gemeinsame NPCs wie Monster usw. definieren). Zusätzlich kann ein Ork die gleichen Zustände haben wie ein Mensch. Nur um zu demonstrieren, dass diese Zustandsdefinition nur von einer ausgewählten Gruppe von Spieleinheiten geteilt werden kann .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Diese Zustände können von einem Abfragesystem verarbeitet werden . Jedes Spiel-Häkchen erfasst den aktuellen Status einer Spieleinheit und überprüft alle Auslöser. Wenn eine Bedingung erfüllt ist, wird der Status der Entität in den Status "goto" geändert.
Der letzte Teil, mit dem ich zu kämpfen hatte, war das Binden von Animationsdaten und Animationszuständen an eine Entität . Der logischste Ansatz schien mir, einen Zeiger auf die von einer Entität verwendeten Zustandsmaschinendaten einzufügen und für jeden Zustand in dieser Maschine zu definieren, welche Animation sie verwendet.
Hier ist ein XML-Beispiel, wie ich das Animationsverhalten und die grafische Darstellung einiger gebräuchlicher Entitäten in einem Spiel definieren würde, indem ich den Animationsstatus und die Animationsdaten-ID anspreche. Beachten Sie, dass sowohl "Wizard" als auch "Orc" den gleichen Animationsstatus haben, jedoch eine andere Animation. Eine andere Animation kann auch ein anderes Sprite Sheet oder sogar eine andere Sequenz von Animationen bedeuten (eine Animation kann länger oder kürzer sein).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Beim Erstellen der Entität wird eine Liste von Status mit Statusmaschinendaten und einer Animationsdatenreferenz hinzugefügt.
In Zukunft würde ich das Entitätssystem verwenden, um ganze Entitäten zu erstellen, indem ich Komponenten in einem ähnlichen XML-Format definiere.
-
Dies ist, was ich nach einigen Nachforschungen gefunden habe. Allerdings hatte ich einige Probleme damit, es in den Kopf zu bekommen, also hoffte ich auf ein Feedback. Gibt es hier etwas, was keinen Sinn ergibt, oder gibt es eine bessere Möglichkeit, mit diesen Dingen umzugehen? Ich habe die Idee verstanden, durch Frames zu iterieren, aber ich habe Probleme, einen Schritt weiterzugehen, und dies ist mein Versuch, dies zu tun.