Skocz do zawartości

SDL i problem z obsługą zdarzeń


otojestemsobieja2008

Polecane posty

Witam,

piszę prostą aplikację w C++ z wykorzystaniem bibliotek SDL.

Polega na tym, że mamy ludzika, którego za pomocą strzałek na klawiaturze możemy poruszać lewo/prawo.

 

Kod do obsługi zdarzeń (główna pętla programu) napisałem tak:

KOD

while (!koniec) {

 

sdl.clear(); //czyścimy okno aplikacji

 

while (SDL_PollEvent (&event)) {

switch (event.type) {

case SDL_QUIT:

koniec=true;

break;

case SDL_KEYDOWN:

if( event.key.keysym.sym == SDLK_f ) { // tataj jakieś instrukcje odnośnie restartu aplikacji (nieistotne)};

break;

case SDL_KEYUP:

hero.stand();

break;

}

}

 

if( event.key.keysym.sym==SDLK_LEFT && event.type == SDL_KEYDOWN )

hero.moveLeft();

 

if( event.key.keysym.sym==SDLK_RIGHT && event.type == SDL_KEYDOWN )

hero.moveRight();

 

 

sdl.blit( &hero ); //pokazujemy chłopka na ekran

 

sdl.refresh(); //flip, wyrównanie czasu gry itd

}

 

 

Problem 1:

Po części to działa. Po części bo działa tak:

wciskamy klawisz "prawo" to chłopek biegnie w prawo - OK.

teraz wciskamy klawisz "lewo", ale nie puszczając klawisza "prawo" to chłopek bieganie w lewo - OK.

Ale jeśli teraz puścimy klawisz "prawo" to chłopek zatrzyma się, ponieważ ostatnie zdarzenie jakie pobrał SDL_PollEvent to puszczenie klawisza.

Owszem mam to zdefiniowane w switchu że puszczenie klawisza oznacza stanie chłopka, ale nawet jak to wywale z kodu to i tak problem się powtarza.

Zupełnie nie wiem jak sobie z tym poradzić.

 

Problem2:

Jeśli trzymam strzałkę (lewo/prawo) chłopek biegnie (lewo/prawo) ale jeśli (nawet trzymając cały czas klawisz) poruszę myszką, chłopek zatrzymuje się.

Też wygląda mi na to, że SDL pobiera jako ostatnie zdarzenie ruch myszką :(

Link do komentarza
Udostępnij na innych stronach

A jeśli potem będę miał w aplkacji 20 klawiszy do użycia? Trochę tych warunków będzie.

Ze 20... Ja nie widzę problemu. Warunków może być dużo. Przykładowo 20 dla OnKeyDown i 20 dla OnKeyUp i w każdym z nich odpowiednio ustawiasz pola z tablicy bool'ów. Następnie w głównej pętli programu tylko sprawdzasz czy dana zmienna logiczna, np. do przesuwania w prawo, jest ustawiona i przesuwasz postać lub nie.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...