TeisL Skrevet 7. desember 2009 Del Skrevet 7. desember 2009 Hei, Jeg har en klasse Game.cpp, hvor jeg har en unsigned char *key pointer. Denne skal da ta imot events. Og jeg setter da denne til: key = SDL_GetKeyState(0); i konstruktøren og i game loopen. Så har jeg da player klassen som da skal behandle disse som skal gjøres i en process funksjon som ser slik ut: void Player::process(SDL_Event *event) { Game *g = Game::GetInstance(); Events::OnEvent(event); if(g->key[SDLK_UP]) jump(1,-1); if(g->key[SDLK_DOWN]) move(0,1); if(g->key[SDLK_RIGHT]) move(1,0); if(g->key[SDLK_LEFT]) move(-1,0); } Problemet er at den aldri kommer inn her. Kan noen hjelpe meg med hva jeg har glemt? Lenke til kommentar
TheMaister Skrevet 8. desember 2009 Del Skrevet 8. desember 2009 (endret) Blir Player::process() aldri kjørt? Under hvilke conditions kaller du på Player::process()? Hvilken event er det som kommer inn i funksjonen? Siden du bruker en SDL_Event, regner jeg med at du bruker SDL_PollEvent( &event ) en eller annen gang? Endret 8. desember 2009 av TheMaister Lenke til kommentar
TeisL Skrevet 8. desember 2009 Forfatter Del Skrevet 8. desember 2009 Blir Player::process() aldri kjørt? Under hvilke conditions kaller du på Player::process()?Hvilken event er det som kommer inn i funksjonen? Siden du bruker en SDL_Event, regner jeg med at du bruker SDL_PollEvent( &event ) en eller annen gang? Jeg er ikke sikker på om jeg egentlig trenger å bruke SDL_Event i Player::process() her. Jeg har i spillmororen Game klassen en key variabel som jeg nevnte. Denne setter jeg til GetKeyState(0). For i Game.cpp så kan jeg da kjøre: key[sDLK_UP] = <handling når oppknapp trykkes>; osv. Og det skjer. I player klassen nå har jeg dette: void Player::process() { Game *g = Game::GetInstance(); //Events::OnEvent(event); if(g->key[SDLK_UP]) jump(1,-1); if(g->key[SDLK_DOWN]) move(0,1); if(g->key[SDLK_RIGHT]) move(1,0); if(g->key[SDLK_LEFT]) move(-1,0); } I Game klassen så kaller jeg den slik, uten at det skjer noen verdens ting: key = SDL_GetKeyState(0); int start = SDL_GetTicks(); Player p(SpriteLib::GFX_MARIO); p.draw(screen, 200, 200); p.process(); Lenke til kommentar
TheMaister Skrevet 8. desember 2009 Del Skrevet 8. desember 2009 (endret) Jeg tror jeg vet. http://sdl.beuc.net/sdl.wiki/SDL_PumpEvents "Pumps the event loop, gathering events from the input devices. SDL_PumpEvents gathers all the pending input information from devices and places it on the event queue. Without calls to SDL_PumpEvents no events would ever be placed on the queue. Often the need for calls to SDL_PumpEvents is hidden from the user since SDL_PollEvent and SDL_WaitEvent implicitly call SDL_PumpEvents. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call SDL_PumpEvents to force an event queue update." Kan være noe der. Hvis SDL_PollEvent() eller noe sånt aldri blir kjørt kan det jo tyde på at event-queuen aldri fylles, og da skjer det ingen ting. Kanskje ... http://sdl.beuc.net/sdl.wiki/SDL_GetKeyState "Note: Use SDL_PumpEvents to update the state array." Endret 8. desember 2009 av TheMaister Lenke til kommentar
TeisL Skrevet 9. desember 2009 Forfatter Del Skrevet 9. desember 2009 Jeg tror jeg vet. http://sdl.beuc.net/sdl.wiki/SDL_PumpEvents "Pumps the event loop, gathering events from the input devices. SDL_PumpEvents gathers all the pending input information from devices and places it on the event queue. Without calls to SDL_PumpEvents no events would ever be placed on the queue. Often the need for calls to SDL_PumpEvents is hidden from the user since SDL_PollEvent and SDL_WaitEvent implicitly call SDL_PumpEvents. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call SDL_PumpEvents to force an event queue update." Kan være noe der. Hvis SDL_PollEvent() eller noe sånt aldri blir kjørt kan det jo tyde på at event-queuen aldri fylles, og da skjer det ingen ting. Kanskje ... http://sdl.beuc.net/sdl.wiki/SDL_GetKeyState "Note: Use SDL_PumpEvents to update the state array." Da har jeg fått den å sjekket at den registrerer tastetrykkene og går i move() funksjonen som den skal. Når jeg brukte debuggeren, så ser jeg at den endrer x og y til recten, så da trodde jeg den skulle tegne den på det nye stedet, men det gjør den ikke. void Player::draw(SDL_Surface *screen) { this->rect.x; this->rect.y; SDL_SetColorKey(this->img,SDL_SRCCOLORKEY | SDL_RLEACCEL,SDL_MapRGB(this->img->format,255,0,255)); SDL_BlitSurface(this->img, NULL, screen, &rect); SDL_UpdateRect(screen, 0, 0, 0, 0); } void Player::move(int xUnit, int yUnit) { //Units int ySpeed = 10; int xSpeed = 10; //Moving code this->rect.x += xSpeed*xUnit; this->rect.y += ySpeed*yUnit; } void Player::process() { Game *g = Game::GetInstance(); //Events::OnEvent(event); if(g->key[SDLK_UP]) jump(1,-1); if(g->key[SDLK_DOWN]) move(0,1); if(g->key[SDLK_RIGHT]) move(1,0); if(g->key[SDLK_LEFT]) move(-1,0); } Her går da tastetrkket inn i den ifen som passer og f.eks. til move. Der så setter jeg en ny verdi på rect.x og rect.y. Så er det i spillloopen at draw og process blir kalte. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå