Abstraktion von Entity System-Animationszuständen

8

Ich habe vor kurzem angefangen, eine Game Engine unter Verwendung des Entity System-Paradigmas zu entwerfen, dh Entities als Aggregation von Komponenten und Systemen, die das eigentliche Spiel implementieren. Während ich in verschiedenen Aspekten Schwierigkeiten hatte, geht es mir am meisten um die Abstraktion / Modularität der verschiedenen Komponenten / Systeme. Nehmen wir an, mein Playerhat mehrere Animationszustände, z. Walking, Sleeping, Jumping, Und eine Art von OpponentEinheit verfügt über mehr (nicht notwendigerweise die gleichen) Staaten wie auch zB. Walking, HidingUsw.

Wie soll ich die Engine so gestalten, dass sie die verschiedenen (Animations-) Zustände jedes Entitätstyps behandelt? Sollte es für jeden Entitätstyp unterschiedliche Animationssysteme geben? Sollte ich Flags verwenden, die dem Animationssystem signalisieren, um die richtige Entität zu rendern? Kann ich auch vermeiden, "hartcodierte" Aufzählungen für die verschiedenen Posen zu verwenden? Ich kann sehen, dass ein Skriptsystem wahrscheinlich helfen könnte, aber ich bin mir fast sicher, dass es eine einfachere Lösung gibt.

Petermer
quelle

Antworten:

4

Nein zu unterschiedlichen Systemen für jeden Typ, das reduziert die Aufteilung der Verantwortung zu fein.

Folgendes mache ich in meinem aktuellen persönlichen Projekt:

Es gibt viele Möglichkeiten, mit dem Zustand umzugehen, aber Sie benötigen wahrscheinlich eine, die für den Menschen sinnvoll ist, oder zumindest eine Brücke zwischen Mensch und Code. Sie müssen sich das Animationssystem als einen großen Mixer vorstellen, anstatt als einen diskreten Zustand. Sie wechseln beispielsweise vom Leerlauf zum langsamen Gehen, indem Sie dem System 50% zu Fuß hinzufügen und später 100% laufen.

Außerhalb des Animationssystems können Sie Zeichenfolgen verwenden, um die Arbeit mit dem System angenehm und für Skripte und Code gleichermaßen einfach zu gestalten. Systemintern erstellen Sie eine Zuordnung zwischen dieser Zeichenfolge und den Animationsdaten . Dies kann mit einem Schlüsselwertspeicher wie einer Hashmap (um Aufzählungen insgesamt zu vermeiden, indem die Animationsdaten zum Speicher gemacht werden) oder mit einer Zeichenfolge zu Aufzählung erfolgen Nachschlagen, wenn Sie so arbeiten möchten. An diesem Punkt ist alles Geschmackssache. Ich bevorzuge den Schlüsselwert, da er vollständig aus XML- oder INI-Dateien stammen kann.

Um verschiedene Typen zu verarbeiten, können Sie auf Systemebene das Zuordnen von Animationssätzen ermöglichen, sodass sich der Satz für "minion" und "run" für den "minion" von dem Satz für "run" und "female player" unterscheidet. Art.

Zusammenfassend: Das Animationssystem ist generisch und Sie haben nur ein System. Die Außenwelt braucht eine freundliche Schnittstelle. Die Innenwelt muss generische Zustände Entitätstypen zuordnen.

Und meine Liste der Dinge, die ich tun möchte, aber noch nicht in mein Design passt:

TODO : Ordnen Sie die Bewegungsgeschwindigkeit automatisch dem Animationstyp zu, damit das Animationssystem "Bewegung mit x-Geschwindigkeit" in die richtige Animation konvertieren kann, anstatt das Hauptprogramm über "Gehen" und "Laufen" zu informieren.

TODO : Teilen Sie Animationen wie Kopf- und Rumpfverfolgung auf transparente Weise.

TODO : Reaktionsanimationen (wie das Schlagen ins Gesicht) werden vom System und nicht vom Hauptprogramm verarbeitet.

Patrick Hughes
quelle
Sie schlagen also vor, einige ifim Animationssystem zu verwenden. Ich war zuvor skeptisch gegenüber der Verwendung von Wörterbüchern für Zeichenfolgen (in C ++), was das Gedächtnis betrifft. Nachdem ich heute über Hashtabellen gelesen habe, finde ich Ihre Antwort einfach genug. In Bezug auf den 'Mixer'-Teil: Bedeutet "Hinzufügen von 50% zu Fuß", dass in 50% der Fälle einige Frames durch die' Walk'-Frames ersetzt werden?
Petermer
Das Mischen ist ein ziemlich häufiger Begriff in der Animation. Es bedeutet wörtlich, dass Sie zwei (oder mehr) Basisanimationen zusammenmischen, um die endgültige Ausgabe zu erhalten. Im 50% -Beispiel gehe ich von einer Mischung aus 50% "Idle" und 50% "Walk" aus, die einen Spaziergang mit halber Geschwindigkeit nach vorne bringen würde. Auf diese Weise können Sie die Bewegung kontinuierlich von "Leerlauf" zu "Gehen" und dann zu "Laufen" variieren. Durch das Mischen können Sie später beispielsweise den unteren Torso laufen lassen, während der obere Torso auf eine Waffe schießt, oder jemandem winken usw. Wenn Ihre Animations-Engine das Mischen nicht unterstützt, können Sie dies als eine Möglichkeit zum Nachdenken verwenden und keine Regel.
Patrick Hughes
1
Zu Ihrer Information: Die Sorge um den Speicher für Zeichenfolgen in Ihrem Programm in dieser Phase ist Zeitverschwendung. Dies wird als "vorzeitige Optimierung" bezeichnet und ist im Allgemeinen eine schlechte Idee. Wenn Strings später wirklich eine große Last verursachen, können sie in kurze CRC-Zahlen umgewandelt werden, um sie alle erheblich zu verkleinern, auf Kosten der einfachen Fehlerbehebung und eines zusätzlichen Schritts für Ihren Erstellungsprozess.
Patrick Hughes