Nehmen wir an, Sie haben eine Animation, die beim Abfeuern einer Kugel auftreten soll. Wie würden Sie erreichen, dass die Kugel am Ende der Animation angezeigt wird? Das einzige, was ich herausfinden kann, ist, die Zeitdauer der Animation zu kennen und das Einstellen der Aufzählungszeichenposition und das Aktivieren zu verzögern, bis diese Zeitdauer verstrichen ist. Ich habe mich nur gefragt, ob dies der beste Ansatz ist. Wie gehen alle anderen damit um?
EDIT: Ich denke, ich habe Probleme, die Frage richtig zu formulieren.
Antworten:
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
Ihr Code sagt also so etwas wie:
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:
Punkte zu beachten:
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.
quelle
In gewisser Weise müssen Sie warten, bis die Animation fertig ist, und dann die Kugel erstellen.
Das Einstellen eines Timers funktioniert, wenn Sie sicher sind, dass Ihre Animationsrate festgelegt ist. Eine geringfügige Änderung ist, dass Sie möglicherweise Code innerhalb des Aufzählungszeichens haben, der es unsichtbar auf einen Moment warten lässt, bevor es angezeigt und verschoben wird.
Abhängig von Ihrer Entwicklungsplattform verfügen Sie möglicherweise über eine Art Animationsaktualisierungsfunktion oder Rückruffunktion, mit der Sie genau in dem Moment reagieren können, in dem die Animation den gewünschten Punkt erreicht. So würde ich es zum Beispiel mit Flixel machen.
quelle
addAnimationCallback
Methode von Flixel kann auf das feuernde Objekt angewendet werden. In der Rückruffunktion können Sie sehen, ob das aktuelle Bild der Feueranimation das Bild ist, das ein Aufzählungszeichen erzeugen soll. Wenn dies der Fall ist, können Sie eine Kugel auf dem Bildschirm hinzufügen.Direkte Antwort: Angenommen, Sie haben eine Animation, die Sie wiedergeben möchten, wenn der Spieler den Feuerknopf drückt, und nach dem Abspielen wird eine Kugel abgefeuert. Im Idealfall sollten Sie vermeiden, die Animationszeit fest zu codieren, und das Aufzählungszeichen abfeuern, wenn die Animation abgeschlossen ist (mithilfe einer Rückruffunktion oder Ähnlichem, abhängig von Ihrer Plattform). Ich kann mir keine andere Methode vorstellen, die nicht allzu komplex ist.
Antwort von Alternate Game Design: Wenn es keinen wirklich, wirklich guten Grund dafür gibt, würde ich vermeiden, dass das Drücken des Feuerknopfs und das Erscheinen der Kugel verzögert wird. Wenn die Animation nicht sehr, sehr kurz ist (ein oder zwei Frames, maximal, im Grunde ein Mündungsblitz), fühlt sich die Feuerknopfreaktion langsam an und wird für einen typischen Spieler nur ärgerlich. Selbst wenn Sie sich dafür entscheiden, eine Animation zu verwenden, bevor die Kugeln herauskommen (rundenbasierte RPGs und taktische Spiele wären akzeptable Gründe dafür), würde ich darüber nachdenken, irgendwo eine Option zum Deaktivieren von Animationen einzufügen, um die zuzulassen Spiel schneller zu bewegen, wenn der Spieler will.
quelle
Wie MrCranky sagt; Halten Sie Animation und Logik getrennt.
Vor allem aber muss die Logik der Hauptteil bleiben .
Beachten Sie, dass die Steuerung der Benutzeroberfläche über die Logik der einzige Weg ist, um sicherzustellen, dass Sie Ihre Logik später behalten, wiederverwenden und freigeben können (neuer Renderer, neues Spiel, Serverversion ohne Renderer ...).
quelle
Zunächst würde ich ein Ereignissystem (Beobachtermuster?) Verwenden, um Teile des Codes zu entkoppeln. Dies gilt nicht nur für die Animation, sondern sicherlich auch dort. Dann kann der Animationscode einfach dispatchEvent (event) sagen und ein anderer Teil des Codes lauscht auf dieses Ereignis, ohne dass ein Teil des Codes voneinander Kenntnis haben muss.
Jetzt muss der Animationscode tatsächlich einen Verweis auf den Event-Dispatcher haben (einfach mit Abhängigkeitsinjektion durchzuführen) und Sie müssen über XML oder JSON verfügen, das Ihre Animationen tatsächlich definiert. Etwas wie:
Lesen Sie die Daten ein, wenn Sie die Animation laden, und lassen Sie den Animationscode das Ereignis auslösen, wenn es sich während der Wiedergabe auf diesem Frame befindet.
quelle