[SFML 2.0] Sporadyczne samo-wciskanie się klawiszy
Ostatnio zmodyfikowano 2014-08-10 13:16
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ą) 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; } } |
|
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. if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
|
|
pekfos |
» 2014-07-24 16:02:30 if( sf::Keyboard::isKeyPressed && event.key.code == sf::Keyboard::Right )
|
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? |
|
1aam2am1 |
» 2014-07-25 11:50:44 http://sfml-dev.org/documentation/2.0/classsf_1_1Event.php 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. |
|
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. |
|
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. |
|
« 1 » |