• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - dwa klawisze wciśnięte (wykonuje się tylko 1)

Object Storage Arubacloud
+4 głosów
496 wizyt
pytanie zadane 23 czerwca 2016 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
edycja 23 czerwca 2016 przez Maciek123233

Witam, zrobiłem pentlę sprawdzającą czy jest wciśnięty guzik w SFMLu. Okodowałem to tak że gdy jest klawisz A/D to obrazek idzie w bok, gdy W w górę. Niestety gdy klikam A+W wykonuje się tylko jeden if. Jak zrobić pętlę która pobierałaby chociaż dwa sprawdzenia?

 

while( oknoAplikacji.isOpen() )
    {
        Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
                 if( zdarzenie.type == Event::Closed )
                     oknoAplikacji.close();


                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::A )
                obrazek.move(-10,0);

                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::W )
                obrazek.move(0,-10);

                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::D )
                obrazek.move(10,0);
        }
   }

 

1
komentarz 23 czerwca 2016 przez Radfler VIP (101,030 p.)
Pokaż fragment kodu, w którym dokonujesz tego sprawdzenia.
komentarz 23 czerwca 2016 przez Ivan Maniak (60,650 p.)
Pokaż co masz. Czyli daj nam kod!
1
komentarz 23 czerwca 2016 przez Maciek123233 Gaduła (3,400 p.)
pokazane :)

5 odpowiedzi

0 głosów
odpowiedź 23 czerwca 2016 przez niezalogowany
wybrane 25 czerwca 2016 przez Maciek123233
 
Najlepsza

Wyrzuć to za pętle wydarzeń:

while( oknoAplikacji.isOpen() )
    {
        Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
                 if( zdarzenie.type == Event::Closed )
                     oknoAplikacji.close();
        }


                ifif (sf::Keyboard::isKeyPressed(sf::Keyboard::A) 
                obrazek.move(-10,0);
 
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) 
                obrazek.move(0,-10);
 
               if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) 
                obrazek.move(10,0);
   }

Tak będzie działać. Ps: poprawiłem jeszcze warunki.

komentarz 25 czerwca 2016 przez Maciek123233 Gaduła (3,400 p.)
Trochę zgubiłeś nawiasy ale wszystko działa, dzięki!
+1 głos
odpowiedź 23 czerwca 2016 przez avi1999 Nowicjusz (200 p.)
Żle podchodzisz do tego, trudno jest zaprogramować płynne poruszanie obiektu za pomocą event'ów. Musisz użyć tzw. liveinput klawiatury :)
0 głosów
odpowiedź 23 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

Bez kodu mogę tylko zgadywać.. ale zdaje mi się, że dzieje się to przez zastosowanie else if. Popraw na same if'y i powinno trybić.

komentarz 23 czerwca 2016 przez Maciek123233 Gaduła (3,400 p.)
nie ma tu else if
0 głosów
odpowiedź 23 czerwca 2016 przez Ehlert Ekspert (212,670 p.)

metoda move() w pętli do obsługi eventów to bardzo zły pomysł.

0 głosów
odpowiedź 24 czerwca 2016 przez jegor377 Stary wyjadacz (13,230 p.)
edycja 24 czerwca 2016 przez jegor377

Powinieneś zrobić sobie 4 boole dla każdej ze stron w którą idziesz i kiedy gracz naciśnie dany przycisk, to ustawiasz dany bool na true, a kiedy puści to zmieniasz na false. Potem tylko zrób metodę, która sprawdza czy dany bool jest ustawiony (czyli ma wartość true) i jeżeli tak, to wtedy nim rusz. Na kursach o robieniu gier tak jest i problem jest dlatego, że program niejednolicie sprawdza te eventy i do tego zanim dostaniesz event o puszczonym klawiszu to możesz dostać jeszcze np. event dotyczący poruszenia myszką i wtedy też powinno przestać "chodzić". ;) Zrób jak mówię i będzie działać. :)

bool forward = false;
bool right = false;
bool left = false;

while( oknoAplikacji.isOpen() )
    {
        Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
                switch(zdarzenie.type) {
                      case sf::Event::KeyPressed:
                              if(zdarzenie.key.code == sf::Keyboard::A) left = true;
                              if(zdarzenie.key.code == sf::Keyboard::W) forward = true;
                              zdarzenie.key.code == sf::Keyboard::D) right = true;
                      break;
                      case sf::Event::KeyUp:
                              if(zdarzenie.key.code == sf::Keyboard::A) left = false;
                              if(zdarzenie.key.code == sf::Keyboard::W) forward = false;
                              zdarzenie.key.code == sf::Keyboard::D) right = false;
                     break;
                     case sf::Event::Closed:
                              oknoAplikacji.close();
                     break;
                }
        }

if(forward) obrazek.move(0,-10);
if(left) obrazek.move(-10,0);
if(right) obrazek.move(10,0);

   }

 

Podobne pytania

0 głosów
1 odpowiedź 238 wizyt
pytanie zadane 16 września 2018 w C i C++ przez Kijoszi Początkujący (330 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 22 sierpnia 2019 w JavaScript przez Dru Nowicjusz (180 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...