Gå til innhold

[Løst]Trenger hjelp med eventhandling


Anbefalte innlegg

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
Videoannonse
Annonse

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 av TheMaister
Lenke til kommentar
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

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 av TheMaister
Lenke til kommentar
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...