Gå til innhold

[Løst][SDL] Problemer med å bevege ett objekt


Anbefalte innlegg

Er ganske ny med SDL, men har fått problemer med å bevege ett object med piltastene.

 

Source:

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

int main ( int argc, char** argv )
{
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
	printf( "Unable to init SDL: %s\n", SDL_GetError() );
	return 1;
}

// make sure SDL cleans up before exit
atexit(SDL_Quit);

// create a new window
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
									   SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !screen )
{
	printf("Unable to set 640x480 video: %s\n", SDL_GetError());
	return 1;
}

// load an image
SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
if (!bmp)
{
	printf("Unable to load bitmap: %s\n", SDL_GetError());
	return 1;
}

// centre the bitmap on screen
int spr1_x = 0, spr1_y = 0;
SDL_Rect dstrect;
dstrect.x = spr1_x;
dstrect.y = spr1_y;

// program main loop
bool up = false;
bool down = false;
bool left = false;
bool right = false;
bool done = false;
while (!done)
{
	// message processing loop
	SDL_Event event;
	while (SDL_PollEvent(&event))
	{
		// check for messages
		switch (event.type)
		{
			// exit if the window is closed
		case SDL_QUIT:
			done = true;
			break;

		case SDL_KEYDOWN:
			{
				switch (event.key.keysym.sym)
				{
					case SDLK_LEFT:
					left = true;
					break;
					case SDLK_RIGHT:
					right = true;
					break;
					case SDLK_UP:
					up = true;
					break;
					case SDLK_DOWN:
					down = true;
					break;
					case SDLK_ESCAPE:
					done = true;
					break;
					default:
					break;
				}
			}

			case SDL_KEYUP:
			switch( event.key.keysym.sym )
			{
				case SDLK_LEFT:
					left = false;
					break;
					case SDLK_RIGHT:
					left = false;
					break;
					case SDLK_UP:
					left = false;
					break;
					case SDLK_DOWN:
					left = false;
					break;
					default:
					break;
			}
		} // end switch
	} // end of message processing

if (left)
{spr1_x -= 1;}
if (right)
{spr1_x += 1;}
if (up)
{spr1_y -= 1;}
if (down)
{spr1_y += 1;}

	// DRAWING STARTS HERE

	// clear screen
	SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

	// draw bitmap
	SDL_BlitSurface(bmp, 0, screen, &dstrect);

	// DRAWING ENDS HERE

	// finally, update the screen :)
	SDL_Flip(screen);
} // end main loop

// free loaded bitmap
SDL_FreeSurface(bmp);

// all is well;)
printf("Exited cleanly\n");
return 0;
}

 

Vet noen hva som er galt?

Lenke til kommentar
Videoannonse
Annonse

Nei, det trenger du ikke.

 

Du må sette: (det var dette jeg mente med å kopiere hver gang)

 

 SDL_Rect dstrect;
dstrect.x = spr1_x;
dstrect.y = spr1_y;

 

i while-løkken, etter du oppdaterer med up, left, osv.

 

Hvis dstrect.x hadde vært en peker hadde din løsning funket.

Endret av spacemonster
Lenke til kommentar

Smart. Det er alltid lurt å jobbe for en så ryddig og oversiktlig kode som mulig. Både fordi det er god trening og praktisk, men også fordi det da blir lettere å endre på ting senere. Vet ikke hvor mye du kan av C++, men objektorientering er noe du bør sette deg inn i hvis du ikke er kjent med det fra før av.

Endret av Dead_Rabbit
Lenke til kommentar

Jeg har alltid kunne litt C++, men i denne uka har jeg prøvd å virkelig sette meg inn i det, har lært alle de nødvendige tingene som looper, funksjoner, typer, data strukturer og sånnt.

 

Men er ikke helt sikker på hva objektorienterings programering er.

Er det sånn som dette?

 

void obj1()
{
...
}
main()
{
  obj1()
  obj2()
}

Lenke til kommentar

Nei, det blir ikke helt objektorientering. Objektorientering er når man enkapsulerer funksjoner og variabler i klasser og lager logiske enheter for funksjonalitet. Dette er et ganske stort tema, så jeg tror ikke jeg går noe nærmere inn på det. Sjekk ut en bok eller en tutorial på nettet (en oppdatert og god tutorial, that is).

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...