TeisL Skrevet 7. desember 2009 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?
TheMaister Skrevet 8. desember 2009 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
TeisL Skrevet 8. desember 2009 Forfatter 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();
TheMaister Skrevet 8. desember 2009 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
TeisL Skrevet 9. desember 2009 Forfatter 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.
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å