Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

shadowstrike

Frischling

  • »shadowstrike« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Wiesbaden

Beruf: Schüler

  • Private Nachricht senden

1

12.12.2010, 22:40

SFML Eingabe Problem: KeyReleased funktioniert nicht wie erwartet

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
Evil Industries - Kaufen Sie jetzt, bereuen Sie später.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

12.12.2010, 22:53

versuchts mal damit Getting real-time inputs(ganz unten)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

shadowstrike

Frischling

  • »shadowstrike« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Wiesbaden

Beruf: Schüler

  • Private Nachricht senden

3

12.12.2010, 22:56

stimmt XD hab jetz den halben tag erfolglos dazu verwendet, keyReleased zum laufen zu bringen xD

danke für den denkanstoß darauf wär ich in den nächsten stunden nichmehr gekommen^^
Evil Industries - Kaufen Sie jetzt, bereuen Sie später.

Werbeanzeige