Grundsätzlich sind Sie auf dem richtigen Weg - Sie müssen wissen, wie lange eine Animation dauert, um so etwas zu tun. Animationen sind mehr als nur eine Sammlung von Frames, sie enthalten alle möglichen anderen Informationen, die Sie benötigen. ZB wie viele Bilder gibt es, funktioniert die Animationsschleife, wie schnell wird sie wiedergegeben (z. B. 10 Animationsbilder pro Sekunde oder 25 oder 60?). Jede Animation kann anhand einiger Daten definiert werden, die von einem generalisierten Animationscode angezeigt und wiedergegeben werden können. Sie sollten den Animationsteil in einen eigenen Code einkapseln, der nichts außer diesen Animationsdefinitionen und der Darstellung der einzelnen Bildrahmen kennt. Das heißt, Sie müssen ein Animationsobjekt haben, das Sie laden, wiedergeben, stoppen und an einer bestimmten Stelle auf dem Bildschirm rendern können.
Ein flexibler Ansatz besteht darin, eine Art Animationsdefinition zu verwenden, um diese Art von Informationen zu kapseln. Anstatt zu sagen "Animation X ist all diese Frames, spielen Sie sie einfach durch", erhalten Sie etwas komplexeres.
ZB mit einer Art verspottetem Datenformat
Animationen =
{
{name = "walk", files = "walk * .png", frameCount = "12", loop = "true"},
{name = "fire" files = "fire * .png" frameCount = "6",
events = {
{name = "bulletLeavesGun", frame = "4", param1 = "43", param2 = "30"}
}
}
}
Ihr Code sagt also so etwas wie:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
Das Erkennen von Ereignissen kann entweder über den Animationscode erfolgen, der Sie zurückruft (dh, wenn ein neues Ereignis erkannt wird, weil die Animation in einem bestimmten Frame abgespielt wurde, ruft er Ihren Spielcode auf, um ihm das neue Ereignis mitzuteilen), oder durch Abfragen von Animation wie folgt:
List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
if (event.name == "bulletLeavesGun")
{
Vector2 bulletPosition = new Vector2(event.param1, event.param2);
Vector2 actualBulletPosition = new Vector2(
character.x + bulletPosition.x,
character.y + bulletPosition.y);
CreateBulletAt(actualBulletPosition);
}
}
Punkte zu beachten:
- Der Animationscode sollte getrennt vom Spielcode vorhanden sein. Sie möchten wirklich nicht, dass Ihr Gameplay-Code zu eng mit den Grundlagen der Animationswiedergabe verknüpft ist.
- Der Animationscode weiß anhand der Animationsdefinition, ob eine Schleife ausgeführt werden soll oder nicht
- Der Animationscode weiß, wann die Animation fertig ist, und kann auf einen anderen Code zurückgreifen, um zu sagen: "Hey, die Animation mit dem Namen" fire "ist gerade fertig. Was möchten Sie jetzt tun?"
- Der Animationscode weiß nichts über Ereignisse, außer dass sie einen Namen und einige damit verbundene willkürliche Daten haben (param1 und param2).
- Der Animationscode weiß, auf welchem Frame er sich gerade befindet, und wenn er auf einen neuen Frame umschaltet, kann er prüfen und sagen: "Oh, ich bin jetzt auf Frame 4, das heißt, dieses Ereignis namens" Feuer "ist gerade passiert Meine Liste der letzten Ereignisse, damit ich jedem erzählen kann, der danach fragt.
Wenn Sie nicht brauchen, dass die Kugel in der Animation abgefeuert wird, sondern erst dann, wenn sie beendet ist, können Sie mit einem viel weniger komplexen System ohne die Vorstellung von Ereignissen davonkommen. Sie möchten jedoch weiterhin ein System, in dem Animationen von selbst wiedergegeben werden, die Dauer der Wiedergabe kennen und nach Abschluss einer Animation auf den Spielcode zurückgreifen können.