Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Sporadyczne samo-wciskanie się klawiszy

Ostatnio zmodyfikowano 2014-08-10 13:16
Autor Wiadomość
Roddeck
Temat założony przez niniejszego użytkownika
[SFML 2.0] Sporadyczne samo-wciskanie się klawiszy
» 2014-07-24 15:41:53
Witam,
   Piszę sobie gierkę 2D (for fun), wiadomo poruszanie postacią itd. ale ostatnio zauważyłem dziwną przypadłość. Od czasu do czasu, po kompilacji moja postać zaczyna sama iść w prawo (teoretycznie powinna to zrobić tylko przy wciśniętej strzałce w prawo ). Nie mam pojęcia co może być przyczyną, więc wkleję kawałek kodu, może ktoś znajdzie przyczynę.
Obsługa eventów: (dodałem te cout'y aby zobaczyć czy faktycznie program odczytuje że klawisze zostały wciśnięte, i tak się dzieje, więc nie jest to wina metody do poruszania postacią)
C/C++
while( okno.pollEvent( event ) )
{
    if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape || event.type == sf::Event::MouseButtonPressed && event.key.code == sf::Mouse::Left )
         okno.close();
   
    if( sf::Keyboard::isKeyPressed && event.key.code == sf::Keyboard::Right )
    {
        player_1.standing = false;
        std::cout << "Is pressed right                              ";
    }
    if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Right )
    {
        player_1.standing = true;
        std::cout << "Relased right                              ";
    }
    if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space )
    {
        std::cout << "Pressed space                             ";
        if( !player_1.mid_air )
        {
            player_1.x = - 5;
            player_1.jump = true;
            player_1.mid_air = true;
        }
    }
P-114289
1aam2am1
» 2014-07-24 15:57:49
Zamień eventy na sf::Keyboard, ponieważ eventy na siebie zachodzą co może stwarzać komplikacje  oraz eventy działają wolniej.

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
P-114290
pekfos
» 2014-07-24 16:02:30
C/C++
if( sf::Keyboard::isKeyPressed && event.key.code == sf::Keyboard::Right )
C/C++
if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Right )
Porównaj te dwie linie. Czegoś wyraźnie brakuje, a coś jest wyraźnie bez sensu..

ponieważ eventy na siebie zachodzą co może stwarzać komplikacje  oraz eventy działają wolniej.
Dlaczego?
P-114291
1aam2am1
» 2014-07-25 11:50:44
http://sfml-dev.org/documentation/2.0/classsf_1_1Event.php
C/C++
union {
    SizeEvent size
    KeyEvent key
    TextEvent text
    MouseMoveEvent mouseMove
    MouseButtonEvent mouseButton
    MouseWheelEvent mouseWheel
    JoystickMoveEvent joystickMove
    JoystickButtonEvent joystickButton
    JoystickConnectEvent joystickConnect
};

Jest to unia elementy w unii mogą na siebie zachodzić (kilka bitów jednego eventa zgadza się z kilkoma innego.)

0101010110110101 - np SizeEvent
0101010110110101 11010101 - np. KeyEvent  

Zachodzą na siebie.


pollEvent dziala tak że reaguje na każdy event nawet na taki którego nie chcemy sprawdzać a także zagęszcza go. Gdy program działa za wolno tworzy się kolejka eventów co może doprowadzić do złego działania programu. Działają wolniej i gorzej dlatego, że wykonujemy przez cały czas kod wewnątrz wile i nie wykonujemy innej części programu. Cytuje:

Pop the event on top of the event queue, if any, and return it.

This function is not blocking: if there's no pending event then it will return false and leave event unmodified. Note that more than one event may be present in the event queue, thus you should always call this function in a loop to make sure that you process every pending event.
P-114333
pekfos
» 2014-07-25 15:55:25
Dlaczego miało by to stwarzać komplikacje w poprawnym kodzie..? I dlaczego w poprawnym kodzie miało by to działać wolniej (niż co..?)? Tylko wtedy twoja uwaga miała by sens. Błędny kod sam w sobie jest komplikacją, nie ma najmniejszego sensu wyliczać, jakie elementy języka i biblioteki będą sprawiać kłopoty w kodzie, który w ogóle nie działa.
P-114339
Roddeck
Temat założony przez niniejszego użytkownika
» 2014-08-10 13:16:36
Rozwiązane, dziękuję wszystkim za pomoc :)
Do zamknięcia.
P-115267
« 1 »
  Strona 1 z 1