Leichte Verzögerung bei sfml Tastenabfrage



  • Hi Leute ich habe folgendes Problem und kann es mir nicht erklären

    ich habe mit sfml ein sprite auf meine monitor dargestellt

    die position habe ich mit 2 Variablen angegeben.
    PlayerX und Player Y. Ausserdem ein dritte Variable die angibt um wieviel Pixel sich das Sprite je Durchlauf bewegt: PlayerSpeed.

    if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == sf::Key::W))
    {
    PlayerY = PlayerY - PlayerSpeed;
    }
    if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == sf::Key::S))
    {
    PlayerY = PlayerY + PlayerSpeed;
    }
    if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == sf::Key::A))
    {
    PlayerX = PlayerX - PlayerSpeed;
    }
    if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == sf::Key::D))
    {
    PlayerX = PlayerX + PlayerSpeed;
    }

    Dies ist die TastenAbfrage mit sfml. Hab schon ein paar möglichkeiten durchprobiert aber zu Beginn habe ich immer eine leichte Verzögerung.
    Das Sprite Bewegt sich ein kleines stück steht dann etwa eine halbe sekunde und bewegt sich dann ohne unterbrechung weiter bis ich die Taste los lasse.
    Wobei die Bewegung mir nicht flüssig erscheint und ein leichtes Rukeln zu erkennnen ist. Woran kann das liegen ?

    Nach der Tastenabfrage wird dann übrigens die Position mit Player.SetPosition(PlayerX,PlayerY);Aktualisiert.



    • [cpp]-Tags benutzen, um den Code lesbar zu machen (erste weisse Schaltfläche unter dem Textfeld).
    • Wie wärs, wenn du die If-Abfragen verschachtelst?
    • Eine Switch-Fallunterscheidung wäre auch eine Möglichkeit.
    • Statt a = a + b; kannst du auch a += b schreiben.
    • Du fragst nur ab, ob seit der letzten Ereignisabfrage eine Taste gedrückt wurde, und nicht, ob sie gedrückt ist (nach einer halben Sekunde werden wiederholte Ereignisse ausgelöst). Um dein Vorhaben zu erreichen, musst du Echtzeit-Abfragen einrichten. In SFML ist das über sf::Input realisiert.


  • Dankeschön hat geklappt!
    Mal ne frage worin besteht eigentlich der unterscheid ob ich das nun über event oder input abfragen lasse? Das einzige was ich mir vorstellen könnte ist das man event abfragen bei einem textprogramm einsetzt wegen der genannten kurzen pause der taste.



  • Wenn ne Taste gedrückt ist, schickt Windows in bestimmten Intervallen eine neue "Systemnachricht" raus, als ob die Taste wieder gedrückt wurde (kA, ob das bei den meisten Linux Distris auch standarmäßig so gehandhabt wird). Deswegen liefern deine if-Abfragen da oben auch nur alle x Millisekunden ein true, daher das Ruckeln.

    Bei der Input Klasse handelt es sich aber um eine Klasse, die das ganze anders handhabt. Sie hat intern ein bool'sches Array mit allen möglichen Zeichen (0-255). Wird ein Knopf gedrückt, wird die entsprechende Variable im Array auf true gesetzt und bleibt dann auch "true" bis die Taste wieder losgelassen wird.



  • Es ist einfach der Unterschied zwischen "die Taste X ist heruntergedrueckt" und die "Taste X hat ihren Zustand von ungedrueckt auf gedrueckt geaendert". Mach mal Notepad auf und druecke x und halte es ein paar Sekunden, alles klar? f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)


Anmelden zum Antworten