Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL: Eventtien kanssa pientä probleemaa

temu92 [16.01.2009 00:57:52]

#

Tällainen ihan pikkupulma mulla mutta en tiedä miten sen saisi fiksailtua.

Elikäs, pääloopissa luetaan käyttäjän syötteitä käyttämällä SDL_Eventtiä. Mutta ongelma tulee siinä kun pitäisi lukea useampaa syötettä samaan aikaan.

Tällaisella koodinpätkällä se vain töksähtelee kun painaa nappulaa (vaikka SDL:n dokumentaatiossa oli tällainen esimerkki):

while(SDL_PollEvent(&event)){
	switch(event.type){
		case SDL_QUIT:
			quit = true;
		break;
		case SDL_KEYDOWN:
			if(event.key.keysym.sym == SDLK_ESCAPE) quit	= true;
			if(event.key.keysym.sym == SDLK_LEFT) object.Turn(-1);
			if(event.key.keysym.sym == SDLK_RIGHT) object.Turn(1);
			if(event.key.keysym.sym == SDLK_UP) object.Move(2);
			if(event.key.keysym.sym == SDLK_DOWN) object.Move(-2);
		break;
	}
}

Ja kun taas käytän tällaista pätkää...

SDL_PollEvent(&event);
if(event.type == SDL_QUIT) quit = true;
if(event.type == SDL_KEYDOWN){
	if(event.key.keysym.sym == SDLK_ESCAPE) quit	= true;
	if(event.key.keysym.sym == SDLK_LEFT) object.Turn(-1);
	if(event.key.keysym.sym == SDLK_RIGHT) object.Turn(1);
	if(event.key.keysym.sym == SDLK_UP) object.Move(2);
	if(event.key.keysym.sym == SDLK_DOWN) object.Move(-2);
}

.. niin objekti kyllä liikkuu niin kauan kun painetaan pohjassa mutta ei anna painaa useampaa nappulaa samaan aikaan sekä liike pysähtyy heti kun liikuttaa hiirtä.

Eli miten sen saa toimimaan ilman että liike töksähtelee aina kun painetaan toista nappulaa tai liikutetaan hiirtä?

Metabolix [16.01.2009 09:01:16]

#

Älä liikuta ja käännä hahmoa vaan aseta sille tietty nopeus, kun nappi menee pohjaan, ja ota nopeus pois, kun nappi nostetaan. Helpoiten tilanteen voi tietenkin tarkistaa SDL_GetKeyState-funktion taulukosta tuon SDL_PollEvent-silmukan jälkeen, jolloin ei tarvitse välittää nappien tulemisista ja menemisistä vaan selviää pelkällä olemisella. ;)

while (SDL_PollEvent(&event)) {
  if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) {
    quit = true;
  }
}
if (quit) break;

Uint8 *napit = SDL_GetKeyState(NULL);
if (napit[SDLK_LEFT]) object.SetTurnSpeed(-1);
if (napit[SDLK_RIGHT]) object.SetTurnSpeed(1);
if (napit[SDLK_DOWN]) object.SetMoveSpeed(-2);
if (napit[SDLK_UP]) object.SetMoveSpeed(2);

object.Turn();
object.Move();

temu92 [16.01.2009 15:13:48]

#

Noniin, tällähän se toimii. Tänks :)

Vastaus

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

Tietoa sivustosta