SFML 2.5 - Charakter animieren

SFML 2.5 - Charakter animieren

Animation, na Klasse!

Um eine Animation in einem Videospiel zu realisieren gehört natürlich etwas mehr dazu als die setTextureRect Methode. Eine Animation besteht schließlich nicht nur aus einem Frame, sondern mehreren. Es müssen alle vier Frames einmal durchlaufen und am besten sollte jeder Frames länger als ein paar Mikrosekunden sichtbar sein.

AniSprite

Am besten wir verpacken das ganze direkt in eine Klasse. Die Erklärung folgt.

AniSprite::AniSprite()
{
m_frameClock.restart();
m_fw = 32;
m_fh = 32;
m_frame = 0;
m_maxFrames = 4;
}

void AniSprite::draw(sf::RenderWindow app)
{
if(m_frameClock.getElapsedTime().asSeconds() > 0.1f)
{
this.setTextureRect(sf::IntRect(m_frame * m_fw, 0, m_fw, m_fh));
m_frameClock.restart();
++m_frame;

if(m_frame == m_maxFrames)
{
m_frame = 0;
}
}

app.draw(this);
}

Das ist vermutlich die einfachste und auf das wichtigste begrenzte Animationsklasse die möglich ist. Die Klasse geht davon aus, dass alle Frames die selbe Breite und Höhe besitzen und arbeitet mit einer festen Zeit wie lange ein Frame sichtbar ist. Man müsste nur noch in der main.cpp ein AniSprite Objekt erstellen, die Textur setzen(!) und anisprite.draw(app); aufrufen.

Erklärung

Vielleicht auch interessant
SFML 2.5 - Charakter bewegen
SFML 2.5 - Charakter bewegen

Einen Sprite mit SFML auf jedem Endgerät identisch bewegen.

Im Konstruktor werden die wichtigsten Kenndaten gesetzt. Es sind insgesamt 4 Frames. Alle haben die Größe 32x32. Die Animation fängt beim ersten Frame an. In der draw Methode wird dann erst mal geprüft ob denn schon die Zeit für einen Frame (In dem Fall 0.1 Sekunden) erreicht bzw. überschritten wurde. Falls dies der Fall ist, wird der jeweilige Bildausschnitt mit setTextureRect angepeilt. Die Clock zum überprüfen der Framezeit wird neu gestartet. Der aktuelle Frame wird erhöht. Jetzt wird noch geprüft ob der momentane Frame dem maximalen Frame entspricht. Falls ja, wird die Animation neu gestartet und alles geht von vorne los.

Mehr...

Für simple Spiele sollte diese Animationsklasse genügen. Bei größeren Spielen mit Animation bei denen Framezeiten variieren, wo in einer Bilddatei mehrere Animationen sind oder wo die Frames unterschiedliche Größen besitzen, benötigt man etwas mehr. Auch Animationen stoppen und pausieren kann relevant werden. Mit der obigen Klasse als Basis sollte es allerdings möglich sein, eine mächtigere Animationsklasse zu entwickeln.

Hinterlasse gerne einen Like oder Kommentar (~‾▿‾)~
Name Text