Hi,
ich und n kumpel arbeiten grad an einem 2D-Framework mit der SFML.
Unter anderem sollen auch Animationen unterstützt werden. Ich habe
jetzt die Aufgabe eine Klasse für Animationen zu schreiben. Im Prinzip
ist das auch kein Problem, das ganze läuft auch im Prinzip alles wunderbar,
allerdings hab ich jetz ein Problem mit der Eingabe:
Zum Testen der Klasse habe ich einfach eine Animation erstellt und alle
Funktionen einmal durchgetestet. Die Animation wechseln (also Beispielsweise
von einer Laufanimation zu einer Angriffsanimation) war kein Problem, auch
das Invertieren des Animationsschrittes (Damit zB die Laufanimationen nicht
2x erstellt werden müssen, also einmal nach links und einmal nach rechts) hat
beim ersten Versuch geklappt. Danach wollte ich, dass die Animation auf Tastendruck
gestoppt wird und beim drücken einer anderen Taste wieder zum laufen gebracht wird
(Testweise mit 'a' und 's'). Das Stoppen hat auch funktioniert, das starten allerdings nicht.
Wenn ich s zum starten drücke, passiert erstmal nichts. Mit ein bisschen glück läuft die
Animation nach ein paar sekunden wieder, mit pech muss ich erst ieine andere Taste drücken
oder klicken, damit überhaupt was passiert.
Hier ausschnitte aus den einzelnen Funktionen die verwendet werden:
Die Nachrichtenschleife in der main()
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
while(Wnd->GetWindow()->IsOpened())
{
if(!Wnd->GetWindow()->GetEvent(*Wnd->GetEvent()))
{
if(Wnd->GetEvent()->Type == Wnd->GetEvent()->Closed)
Wnd->GetWindow()->Close();
if(Wnd->GetEvent()->Type == Wnd->GetEvent()->KeyReleased)
{
if(Wnd->GetEvent()->Key.Code == sf::Key::A)
{
anim->stopAnimation();
}
else if(Wnd->GetEvent()->Key.Code == sf::Key::S)
{
anim->startAnimation(ef::ANIMATION_STAND);
}
}
}
|
Hier die C_Animation::draw(C_Window*)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
void ef::C_Animation::draw(ef::C_Window* window)
{
if(m_eDirection == DIRECTION_LEFT)
m_cAnimationStep->FlipX(true);
if(m_eDirection == DIRECTION_RIGHT)
m_cAnimationStep->FlipX(false);
window->GetWindow()->Draw(*m_cAnimationStep);
}
|
Hier die C_Animation::update()
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
void ef::C_Animation::update()
{
if(m_bIsPlaying)
{
//Ist das Intervall zwischen 2 Animationsschritten vorbei, nächsten Schritt anzeigen
if(m_cAnimationTimer->GetElapsedTime() > m_dAnimationIntervall)
{
m_fStepX += m_iStepWidth;
m_cAnimationStep->SetSubRect(sf::IntRect((int)m_fStepX, (int)m_fStepY,(int) m_fStepX + m_iStepWidth, (int)m_fStepY + m_iStepHeight));
//Timer zurücksetzen
m_cAnimationTimer->Reset();
//Ist die Animation zu Ende?
if(m_fStepX + m_iStepWidth >= m_iWidth)
{
//Animationsschritt an den Anfang setzen
m_fStepX = 0;
m_cAnimationStep->SetSubRect(sf::IntRect((int)m_fStepX, (int)m_fStepY, (int)m_fStepX + m_iStepWidth, (int)m_fStepY + m_iStepHeight));
//Wenn die Animation zuende ist und das Objekt am Attackieren war, je nach Status die Animation ändern
if(m_bIsAttacking)
{
m_bIsAttacking = false;
switch(m_eCurrentAnimation)
{
case ANIMATION_ATTACK:
setAnimation(ANIMATION_STAND);
break;
case ANIMATION_WALK_ATTACK:
setAnimation(ANIMATION_WALK);
break;
case ANIMATION_JUMP_ATTACK:
setAnimation(ANIMATION_STAND);
break;
}
}
}
}
}
}
|
Und Hier noch die oben verwendeten Funktionen startAnimation und stopAnimation
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
bool ef::C_Animation::isAttacking()
{
return m_bIsAttacking;
}
void ef::C_Animation::stopAnimation()
{
m_bIsPlaying = false;
m_fStepX = 0.0f;
}
|
Wnd-GetWindow() gibt einen Zeiger auf ein sf::RenderWindow zurück
Der Compiler gibt in Bezug auf die Animationsklasse keine einzelne Warnung aus und igs nur
eine die sagt, dass sprintf veraltet is (sprintf wird zu fps ausgabe benutzt)
Ich hoffe, dass ihr den Fehler erkennen könnt, mein kumpel, der auch die C_Window-Klasse
geschrieben hat, kam damit auch nicht zurecht
mfg,
Shadowstrike