Tengo un problema con un programa y me dijeron que en este foro me podían ayudar. Estoy programando juegos con la librería SDL con C++, pero no avanzo mucho porque apenas soy principiante con esta librería.
El problema que tengo es que quiero hacer colisionar dos cuadrados; uno amarillo que es el "PJ" el cual puedo mover por la pantalla y otro gris que está fijo en las coordenadas (1300,1500) todo funciona bien pero no logro hacer que los dos objetos colisionen. Cuando activo el código el PJ se queda quieto y no va a ningún lado. ¿Podría alguien ayudarme?
Aquí les dejo el código y un enlace donde pueden descargar los recursos que utiliza el programa:
*NOTA: el fragmento de código está comentado y está ubicado en la definición de la función "MOVER()" de la clase "PJ_CLASE".
https://rapidshare.com/files/2681080489/PJ.rar
Using cpp Syntax Highlighting
- #include <SDL.h>
- #include <SDL_image.h>
- #include <string>
- const int PANTALLA_ANCHO = 800;
- const int PANTALLA_ALTO = 600;
- const int PANTALLA_BPP = 32;
- const int PJ_ANCHO = 90;
- const int PJ_ALTO = 115;
- const int NIVEL_ANCHO = 3000;
- const int NIVEL_ALTO = 3000;
- int var1 = 8;
- bool FIN = false;
- SDL_Surface *PANTALLA = NULL;
- SDL_Surface *PJ = NULL;
- SDL_Surface *TERRENO = NULL;
- SDL_Rect CAMARA = { 0, 0, PANTALLA_ANCHO, PANTALLA_ALTO };
- SDL_Rect XXXR;
- SDL_Event EVENTO;
- bool COLISION( SDL_Rect A, SDL_Rect B )
- {
- //LOS LADOS DE LOS RECTANGULOS
- int leftA, leftB;
- int rightA, rightB;
- int topA, topB;
- int bottomA, bottomB;
- //CALCULAR LOS LADOS DE LA RECTA A
- leftA = A.x;
- rightA = A.x + A.w;
- topA = A.y;
- bottomA = A.y + A.h;
- //CALCULAR LOS LADOS DE LA RECTA B
- leftB = B.x;
- rightB = B.x + B.w;
- topB = B.y;
- bottomB = B.y + B.h;
- //SI ALGUNO DE LOS LADOS DESDE A ESTAN FUERA DE B
- if( bottomA <= topB ){ return false; }
- if( topA >= bottomB ){ return false; }
- if( rightA <= leftB ){ return false; }
- if( leftA >= rightB ){ return false; }
- //SI NINGUNO DE LOS LADOS DESDE A ESTAN FUERA DE B
- return true;
- }
- class PJ_CLASE
- {
- private:
- //The X and Y offsets of the dot
- SDL_Rect RECTA;
- int x, y;
- //The velocity of the dot
- int VELX, VELY;
- public:
- //Initializes the variables
- PJ_CLASE();
- //Takes key presses and adjusts the dot's velocity
- void TECLADO();
- //Moves the dot
- void MOVER();
- //Shows the dot on the screen
- void MOSTRAR();
- //Sets the camera over the dot
- void CAMARA_C();
- };
- SDL_Surface *CARGAR( std::string filename )
- {
- //The image that's loaded
- SDL_Surface* IMG_C = NULL;
- //The optimized surface that will be used
- SDL_Surface* IMG_OPT = NULL;
- //Load the image
- IMG_C = IMG_Load( filename.c_str() );
- //If the image loaded
- if( IMG_C != NULL )
- {
- //Create an optimized surface
- IMG_OPT = SDL_DisplayFormat( IMG_C );
- //Free the old surface
- SDL_FreeSurface( IMG_C );
- //If the surface was optimized
- if( IMG_OPT != NULL )
- {
- //Color key surface
- SDL_SetColorKey( IMG_OPT, SDL_SRCCOLORKEY, SDL_MapRGB( IMG_OPT->format, 0, 0xFF, 0xFF ) );
- }
- }
- //Return the optimized surface
- return IMG_OPT;
- }
- void DIBUJAR( int x, int y, SDL_Surface* ORIGEN, SDL_Surface* DESTINO, SDL_Rect* CLIP = NULL )
- {
- //Holds offsets
- SDL_Rect RECTANGULO;
- //Get offsets
- RECTANGULO.x = x;
- RECTANGULO.y = y;
- RECTANGULO.w = ORIGEN->w;
- RECTANGULO.h = ORIGEN->h;
- //Blit
- SDL_BlitSurface( ORIGEN, CLIP, DESTINO, &RECTANGULO );
- }
- bool INICIAR()
- {
- //Initialize all SDL subsystems
- if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
- {
- return false;
- }
- //Set up the screen
- PANTALLA = SDL_SetVideoMode( PANTALLA_ANCHO, PANTALLA_ALTO, PANTALLA_BPP, SDL_SWSURFACE );
- //If there was an error in setting up the screen
- if( PANTALLA == NULL )
- {
- return false;
- }
- //Set the window caption
- SDL_WM_SetCaption( "Movimiento De PJ", NULL );
- //If everything initialized fine
- return true;
- }
- bool CARGAR_ARCHIVOS()
- {
- //Load the dot image
- PJ = CARGAR( "pj_1.bmp" );
- TERRENO = CARGAR( "terreno.bmp" );
- //If there was a problem in loading the dot
- if( PJ == NULL )
- {
- return false;
- }
- //If there was a problem in loading the background
- if( TERRENO == NULL )
- {
- return false;
- }
- //If everything loaded fine
- return true;
- }
- void LIMPIAR_ARCHIVOS()
- {
- //Free the surfaces
- SDL_FreeSurface( PJ );
- SDL_FreeSurface( TERRENO );
- //Quit SDL
- SDL_Quit();
- }
- PJ_CLASE::PJ_CLASE()
- {
- //Initialize the offsets
- RECTA.x = 0;
- RECTA.y = 0;
- //Initialize the velocity
- VELX = 0;
- VELY = 0;
- }
- void PJ_CLASE::TECLADO()
- {
- //If a key was pressed
- if( EVENTO.type == SDL_KEYDOWN )
- {
- //Adjust the velocity
- switch( EVENTO.key.keysym.sym )
- {
- case SDLK_UP: VELY -= var1; break;
- case SDLK_DOWN: VELY += var1; break;
- case SDLK_LEFT: VELX -= var1; break;
- case SDLK_RIGHT: VELX += var1; break;
- case SDLK_a: RECTA.x=1300; RECTA.y=1500; break;
- }
- }
- //If a key was released
- else if( EVENTO.type == SDL_KEYUP )
- {
- //Adjust the velocity
- switch( EVENTO.key.keysym.sym )
- {
- case SDLK_UP: VELY += var1; break;
- case SDLK_DOWN: VELY -= var1; break;
- case SDLK_LEFT: VELX += var1; break;
- case SDLK_RIGHT: VELX -= var1; break;
- }
- }
- if(EVENTO.key.keysym.sym == SDLK_ESCAPE){ FIN = true; }
- }
- void PJ_CLASE::MOVER()
- {
- RECTA.x += VELX;
- RECTA.y+= VELY;
- if( RECTA.x < 0 ){ RECTA.x = RECTA.x -= VELX; }
- if( RECTA.y < 0 ){ RECTA.y = RECTA.y-= VELY; }
- if( RECTA.x +90 > 3000 ){ RECTA.x -= VELX; }
- if( RECTA.y +115 > 3000 ){ RECTA.y-= VELY; }
- /*if( COLISION( RECTA,XXXR) ){ RECTA.x -= VELX;}
- if( COLISION( RECTA,XXXR) ){ RECTA.y -= VELY;}*/
- }
- void PJ_CLASE::MOSTRAR()
- {
- //Show the dot
- DIBUJAR( RECTA.x - CAMARA.x, RECTA.y - CAMARA.y, PJ, PANTALLA );
- }
- void PJ_CLASE::CAMARA_C()
- {
- CAMARA.x = ( RECTA.x + PJ_ANCHO /2 ) - PANTALLA_ANCHO /2;
- CAMARA.y = ( RECTA.y + PJ_ALTO /2 ) - PANTALLA_ALTO /2;
- if( CAMARA.x < 0 ){ CAMARA.x = 0; }
- if( CAMARA.y < 0 ){ CAMARA.y = 0; }
- if( CAMARA.x > 3000 - CAMARA.w ){ CAMARA.x = 3000 - CAMARA.w; }
- if( CAMARA.y > 3000 - CAMARA.h ){CAMARA.y = 3000 - CAMARA.h; }
- }
- int main( int argc, char* args[] )
- {
- //Quit flag
- //The dot
- PJ_CLASE MAKIA;
- //The frame rate regulator
- //Initialize
- if( INICIAR() == false )
- {
- return 1;
- }
- //Load the files
- if( CARGAR_ARCHIVOS() == false )
- {
- return 1;
- }
- XXXR.x=1500;
- XXXR.y=1500;
- XXXR.w=150;
- XXXR.h=150;
- //While the user hasn't quit
- while( FIN == false )
- {
- //Start the frame timer
- //While there's events to handle
- while( SDL_PollEvent( &EVENTO ) )
- {
- //Handle events for the dot
- MAKIA.TECLADO();
- //If the user has Xed out the window
- if( EVENTO.type == SDL_QUIT )
- {
- //Quit the program
- FIN = true;
- }
- }
- //Move the dot
- MAKIA.MOVER();
- //Set the camera
- MAKIA.CAMARA_C();
- //Show the background
- DIBUJAR( 0, 0, TERRENO, PANTALLA, &CAMARA );
- SDL_FillRect( TERRENO, &XXXR, SDL_MapRGB( TERRENO->format, 0x77, 0x77, 0x77 ) );
- MAKIA.MOSTRAR();
- //Update the screen
- if( SDL_Flip( PANTALLA ) == -1 )
- {
- return 1;
- }
- //Cap the frame rate
- }
- //Clean up
- LIMPIAR_ARCHIVOS();
- return 0;
- }
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4