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

1

04.11.2011, 10:19

Tastenabfrage läuft nicht flüssig (SFML 2.0)

Moin,

schreibe zZ eine kleine Anwendung mit der SFML 2.0.
Nun möchte ich meine Keystates abfragen um meine Figur zu lenken:

<- : Links rotieren
-> : rechts rotieren
^ : Gradeaus fliegen

Ich kann auch schon Geradeaus fliegen und dabei rotieren, das Problem ist jetzt, dass wenn ich rotiere und dann erst geradeaus fliegen will, sich nichts mehr bewegt. Erst bei erneuten drücken der tasten.

Wie bekomme ich das jeztz in den Griff das die Lenkung relativ flüssig von Statten geht^^

Hier noch mein Quellcode zur Steuerung:

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
void Spieler::Move ()
{
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up))
    {
        m_SpielerSprite.Move(cos((m_SpielerSprite.GetRotation()-90)*3.14159265/180)*5, sin((m_SpielerSprite.GetRotation()+90)*3.14159265/180)*-5);
    }

    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Left))
    {
        m_SpielerSprite.Rotate(-5);
    }

    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Right))
    {
        m_SpielerSprite.Rotate(5);
    }

    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up) && sf::Keyboard::IsKeyPressed(sf::Keyboard::Left))
    {
        m_SpielerSprite.Move(cos((m_SpielerSprite.GetRotation()-90)*3.14159265/180)*3, sin((m_SpielerSprite.GetRotation()+90)*3.14159265/180)*-3);
        m_SpielerSprite.Rotate(-5);
    }

    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up) && sf::Keyboard::IsKeyPressed(sf::Keyboard::Right))
    {
        m_SpielerSprite.Move(cos((m_SpielerSprite.GetRotation()-90)*3.14159265/180)*3, sin((m_SpielerSprite.GetRotation()+90)*3.14159265/180)*-3);
        m_SpielerSprite.Rotate(5);
    }

}


Gruß
AcidKiller

2

04.11.2011, 10:45

Rufst Du die Funktion in der PollEvent-Schleife auf? Wenn ja, dann sollte sie da raus. Übrigens: Wenn der Spieler die linke Pfeiltaste drückt, musst Du eigentlich nicht mehr prüfen, ob er auch die Rechte drückt (hebt sich ja sowieso gegenseitig auf).

3

04.11.2011, 11:26

Ja hatte das in der Schleife mit dem PollEvent. Hab es jetzt so abgeändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (m_bGameRun == true)
    {
        sf::Event event;
        
        while (app.PollEvent (event))
        {
            if (event.Type == sf::Event::Closed)
            {
                //app.Close();
                m_bGameRun = false;
            }

            
            m_pSpieler.CheckCollision(app);
        }
        m_pSpieler.Move(app); // <---------------------- Die Move ist jetzt hier anstatt unter CheckCollision()
        app.Clear();
        app.Draw(m_pSpieler.getSpielerSprite());
        app.Draw(m_pShot.GetShotSprite());
        app.Display();
    }


Einzige Problem an der Sache ist jetzt, dass die Geschwindigkeit von dem SpielerSprite viel zu hoch ist. Man sieht es praktisch garnicht mehr ^^

4

04.11.2011, 12:05

Oke das Problem mit der geschwindigkeit hat sich erledigt. Läuft jetzt erstmal alles so wie es soll^^

Danke für die Antwort hat mich weiter gebracht :thumbup:

AcidKill3r

Ressaw

Frischling

Beiträge: 19

Wohnort: Nähe von Krefeld

Beruf: Schüler

  • Private Nachricht senden

5

04.11.2011, 12:07

Multipliziere doch einfach zu der Move-Funktion die aktuelle Framezeit (so garantierst du, dass es auf allen Pc's gleich schnell läuft) und noch einen anderen, festgelegten Wert (je nach dem ob es schneller (x>1) oder langsamer (x<1) sein soll), dann sollte es Funktionieren.

PS.: Die Kollisionsabfrage gehört auch nicht in die PollEvent-Schleife ;)

Mfg Ressaw

//EDIT: Zu langsam :D

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.11.2011, 12:11

Du hast auch nen dicken Fehler im Code. Du fragst die Steuerung doppelt ab. Einmal werden die Tasten einzeln geprüft und danach zusammen. Wenn man jetzt links und hoch gleichzeitig drückt, dann wird die Sprite doppelt gedreht und doppelt bewegt. Gewollt ist das vermutlich nicht;) Wenn du die Fälle wirklich einzeln betrachten willst, also die der einzelnen Tasten und den Fall, dass hoch und eine Richtungstaste gedrückt wird, musst du erst die Variante mit 2 Tasten abfragen und danach einen else-Block für die anderen Fälle machen. In deinem Fall kannst du die beiden letzten Abfragen aber auch einfach weglassen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

04.11.2011, 12:48

Übrigens, die PollEvent-Schleife läuft nur, solange es Events gibt, beispielsweise wenn Du eine Taste drückst. Wenn kein Event stattfindet, dann wird der Code auch nicht ausgeführt. In deinem Fall mit der Kollisionsabfrage würde das bedeuten: Nur, wenn Du beispielsweise eine Taste drückst, wird auch überprüft, ob eine Kollision statt findet. Das ist natürlich nicht, was Du willst, deshalb gehört das alles nicht in diese PollEvent-Schleife.

8

04.11.2011, 16:52

@ Schorsch: Oh ja danke für den Hinweis. Hab mich die ganze Zeit schon gewundert, warum ich wenn ich kurven fliege doppelt so schnell werde xD Werd' das gleich nochmal ändern.

@ Codevine: CheckCollision macht bisher nur die Abfrage ob ich über den Bildschirmrand hinaus fliege^^ Aber hab die Funktion trotzdem schon aus dem PollEvent herraus genommen, später werden ja noch weitere Abfragen hinzukommen die auch auftreten können wenn ich nicht fliege.

@ Ressaw: Jop danke. Musste in der SFML erstmal herraus finden, wie ich das mit der Zeit anstelle. Habe jetzt von dem aktuellem Fenster die .GetFrameTime() (Sry fals die Methode etwas anders heisst habe den Quellcode grade nicht vor mir^^) genommen und hinzu addiert.

Gruß
AcidKiller

Werbeanzeige