Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Venaaminen

DumTom [27.11.2010 22:10:06]

#

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;
}

DumTom [27.11.2010 23:18:34]

#

//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;
}

User137 [28.11.2010 03:12:51]

#

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.

hunajavohveli [28.11.2010 14:08:40]

#

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;
	}
}

DumTom [29.11.2010 10:17:24]

#

Kiitos!:)

Meitzi [29.11.2010 20:10:48]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta