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ä?
Ä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();
Noniin, tällähän se toimii. Tänks :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.