Mikä olisi paras tapa SDL pohjaisessa pelissä yhtäkkiä käydä kyttäämään nuolinappeja?
Kokeilin tälläistä.
while(A.Direction!=0) KyttaaNuolia(); //ylempi muualla koodissa char KyttaaNuolia(void) { int mx,my; Uint8* nappi,hiiri; SDL_Event event; while(SDL_WaitEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE:A.Direction=-1;;break; case SDLK_UP: A.Direction= 1; break; case SDLK_DOWN: A.Direction = 3; break; case SDLK_LEFT: A.Direction = 4; break; case SDLK_RIGHT: A.Direction =2; break; } } } return A.Direction; }
//Kokeilin myös tälläistä vailla tulosta char KyttaaNuolia(void) { Uint8* nappi; SDL_Event event; A.Direction=0; for (;;) { SDL_WaitEvent(&event); switch(event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE:A.Direction=-1;;break; case SDLK_UP: A.Direction= 1; break; case SDLK_DOWN: A.Direction = 3; break; case SDLK_LEFT: A.Direction = 4; break; case SDLK_RIGHT: A.Direction =2; break; } } } return A.Direction; }
Onko noiden tarkotus palauttaa char tyyppinen muuttuja? Näyttää siltä ettet käytä paluuarvoa ollenkaan. Ja näkyy 2 peräkkäistä puolipistettä SDLK_ESCAPE riveillä.
Kuuluisiko while(A.Direction!=0)
olla mieluummin while(A.Direction==0)
Muulloin silmukasta poistutaan pääohjelmaan aina vasta sitten kun napit on päästetty irti. Ja tuohon sopii paremmin do_while.
Ensimmäisessä koodissa toistat silmukkaa, kunnes SDL_WaitEvent palauttaa arvon 0. Tämä tapahtuu vain silloin, kun tapahtumien lukemisessa sattuu virhe, mikä tuskin on se, mitä haluat odottaa. Toisessa koodissa taas toistat silmukkaa ikuisesti ilman lopetusehtoa. Huomaa, että break poistuu aina vain sisimmästä rakenteesta, joka tässä tapauksessa on switch. Silmukan suorittamiseen se ei vaikuta siis mitenkään.
Tässä yksi tapa hoitaa asia:
char KyttaaNuolia(void) { for (;;) { SDL_Event event; SDL_WaitEvent(&event); if (event.type != SDL_KEYDOWN) continue; SDLKey k = event.key.keysym.sym; if (k == SDLK_ESCAPE) return -1; if (k == SDLK_UP) return 1; if (k == SDLK_DOWN) return 2; if (k == SDLK_LEFT) return 3; if (k == SDLK_RIGHT) return 4; } }
Kiitos!:)
User137 kirjoitti:
Muulloin silmukasta poistutaan pääohjelmaan aina vasta sitten kun napit on päästetty irti.
Hiiren tapauksessa kuitenkaan ei toimintoa saisi suorittaa ennekuin napista on päästetty irti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.