Ich möchte einen besseren Überblick darüber bekommen, wie Menschen in der realen Welt mit ihren Animationen umgehen.
Laden Sie 1 großes Bild und zeichnen Sie dann verschiedene Rechtecke basierend auf dem Animationsrahmen?
Laden Sie X-Bilddateien in ein Array und zeichnen Sie das Element im Array basierend auf dem Animationsrahmen?
Wie gehen Sie mit unterschiedlich langen Animationen für verschiedene Sprites um?
Nehmen wir an, ein Charakter braucht zu Fuß 4 - 8 Frames und die Wellen am Strand nur 2 - 3 Frames. Wie würden Sie mit dieser Situation umgehen? Siehe unten
Dim Waves(1) as Sprite
Dim Char(5) as Sprite
Sub Animate()
Frame += 1
Draw Char(Frame)
Draw Waves(Frame)
If Frame = 5 Then Frame = 0
End Sub
Offensichtlich würde Waves einen Fehler machen, der außerhalb der Grenzen liegt.
Oder macht sich Ihr Sprite Sorgen um seine eigene Animation und kümmert sich überhaupt nicht um den Frame? Hat jedes Sprite eine eigene Animationsschleife?
Ich hätte eine Animation, wie viele Frames es hat. Wo und wie diese gespeichert werden, ist mit Ausnahme von Leistungsproblemen (wie Sie sie möglicherweise in derselben Textur haben möchten) relativ irrelevant. Ich würde nie 1 zum Bildzähler hinzufügen, ich würde deltaTime * animSpeed hinzufügen und diesen Wert bei der Anzeige in eine Ganzzahl umwandeln. Auf diese Weise können Sie die Animationen verlangsamen oder beschleunigen und sind unabhängig von der Framerate.
Ein Sprite hätte also eine Animation, die sich selbst aktualisiert.
quelle
Warum nicht einfach die Anzahl der Frames für jedes Ihrer Objekte speichern lassen? Persönlich gebe ich die Anzahl der Frames in der Animation an meine Objekte in ihren Konstruktoren weiter, dann habe ich eine Standardfunktion Animate (), die die Anzahl der Frames in der Animation berücksichtigt.
quelle
Das hängt von der Implementierung ab. In meiner Engine mache ich Animationen in Direct3D und DirectDraw.
In DirectDraw erstelle ich ein großes Bild. Es wird sowieso alles im Systemspeicher gespeichert, was schließlich zu einem eindimensionalen Datenblock führt.
Vorteile:
Nachteile:
Sie können nicht nur einen Frame auf den Bildschirm kopieren, sondern müssen dies manuell tun.
Riesiger Speicherblock. Das Herumtollen von Bildern wird mit einer Strafe geahndet.
In Direct3D verwende ich separate Texturen. Dies liegt daran, dass ich keine Ahnung von den Texturbeschränkungen eines Geräts habe und daher nicht weiß, ob es auch Texturen unterstützt, die die Größe des gesamten Bildes haben.
Vorteile:
Nachteile:
quelle
In meinen Spielen habe ich meiner Sprite-Basisklasse das Wissen vermittelt, wie man sich selbst zeichnet, und alle animierten Elemente erben dieses Wissen: Anzahl und Dauer der Animationsrahmen, Position auf dem Bildschirm usw. Die Hauptspielschleife durchläuft nur alle der Sprites und bittet jeden, sich selbst zu zeichnen, wie es passt. Scheint recht gut zu funktionieren und ist etwas modularer zu booten: Wenn Sie ein neues Sprite mit einer anderen Animationsschleife hinzufügen (oder noch komplexer: mehrere Animationszustände), müssen Sie Ihr Animate nicht zurückschreiben und neu schreiben () Routine zur Berücksichtigung der zusätzlichen Komplexität:
Bei jedem Aufruf der update () -Methode eines Sprites wird festgelegt, ob dasselbe Bild wie beim letzten Mal neu gezeichnet, zum nächsten Bild in der aktuellen Animation gewechselt oder zu einer neuen Animation gewechselt werden soll.
Dies hat den zusätzlichen Vorteil, dass es viel einfacher ist, die Framerate anzupassen, um unterschiedlichen Takt- / Plattform-Rendergeschwindigkeiten Rechnung zu tragen, da die einzige Änderung darin besteht, wie oft Sie Animate () aufrufen.
quelle