if( PJ.y +ANCHO_PJ>500 ){ PJ.y=500; }
entonces los que quiero es que el PJ se detenga despues de saltar pero esta ves comprobando la colision.esto es como para juego de plataformas.el problema es, que no me sale como quiero,si alguien tiene un codigo mejor que el mio por favor que me lo de,lo estoy necesitando mucho.aqui les dejo mi codigo:
- Código: Seleccionar todo
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
void TECLADO();
bool COLISION( SDL_Rect A, SDL_Rect B );
void PJ_PARADO ();
void PJ_IZQUIERDA ();
void PJ_DERECHA ();
void PJ_SALTANDO();
void PERSONAJE_MOVER ( int VEL_X );
void PJ_CAMBIAR_ESTADO(int NUEVO);
void DIBUJAR_NUMERO(TTF_Font *FUENTE,int NUM,int x,int y,SDL_Surface * PANTALLA);
SDL_Surface *PANTALLA;
SDL_Surface *PJ;
SDL_Surface *FONDO;
SDL_Surface *PLATA;
SDL_Event EVENTO;
TTF_Font *FUENTE = NULL;
SDL_Rect PJ_R;
SDL_Rect FONDO_R;
SDL_Rect PLATA_R;
SDL_Rect PLATA_R2;
bool SALIR = false;
char TITULO[]="PRUEBA DE PLATAFORMAS 1";
int ESTADO=1;
int VEL_INICIAL=1;
Uint8 * TECLAS = SDL_GetKeyState (NULL);
/***************************/
int main(int argc, char *argv[])
{
SDL_Init( SDL_INIT_VIDEO );
SDL_WM_SetCaption( TITULO, NULL );
PANTALLA = SDL_SetVideoMode(800,600,24,SDL_HWSURFACE);
FONDO = SDL_LoadBMP("fondo.bmp");
PJ = SDL_LoadBMP("pj.bmp");
PLATA = SDL_LoadBMP("plataforma.bmp");
TTF_Init();
FUENTE = TTF_OpenFont( "cour.ttf", 16 );
PJ_R.x = 0;
PJ_R.y = 500;
PJ_R.w = PJ->w;
PJ_R.h = PJ->h;
FONDO_R.x = 0;
FONDO_R.y = 0;
FONDO_R.w = FONDO->w;
FONDO_R.h = FONDO->h;
PLATA_R.x = 60;
PLATA_R.y = 550;
PLATA_R.w = PLATA->w;
PLATA_R.h = PLATA->h;
PLATA_R2.x = 300;
PLATA_R2.y = 450;
PLATA_R2.w = PLATA->w;
PLATA_R2.h = PLATA->h;
while( SALIR == false )
{
while( SDL_PollEvent( &EVENTO ) )
{
//EVENTOS DEL TECLADO
if( EVENTO.type == SDL_QUIT ){ SALIR = true; }
if(EVENTO.key.keysym.sym == SDLK_ESCAPE ){ SALIR = true;}
}//FIN WHILE #2
switch (ESTADO)
{
case 1:
PJ_PARADO ();
break;
case 2:
PJ_IZQUIERDA ();
break;
case 3:
PJ_DERECHA ();
break;
case 4:
PJ_SALTANDO ();
break;
}//FIN SWITCH #1
SDL_BlitSurface(FONDO,NULL,PANTALLA,&FONDO_R);
DIBUJAR_NUMERO(FUENTE,PJ_R.x,10,10,PANTALLA);
DIBUJAR_NUMERO(FUENTE,PJ_R.y,10,30,PANTALLA);
DIBUJAR_NUMERO(FUENTE,VEL_INICIAL,10,50,PANTALLA);
SDL_BlitSurface(PJ,NULL,PANTALLA,&PJ_R);
SDL_BlitSurface(PLATA,NULL,PANTALLA,&PLATA_R);
SDL_BlitSurface(PLATA,NULL,PANTALLA,&PLATA_R2);
SDL_Flip(PANTALLA);
}//FIN WHILE #1
//DECARGA DE SUPERFICIES Y OTROS RECURSOS
SDL_FreeSurface(FONDO);
SDL_FreeSurface(PJ);
SDL_FreeSurface(PLATA);
TTF_CloseFont(FUENTE);
TTF_Quit();
SDL_Quit ();
return 0;
}
/*****************************/
bool COLISION( SDL_Rect A, SDL_Rect B )
{
//Lados de los rectangulos
int leftA, leftB;
int rightA, rightB;
int topA, topB;
int bottomA, bottomB;
//Calcular los lados del rectangulo A
leftA = A.x;
rightA = A.x + A.w;
topA = A.y;
bottomA = A.y + A.h;
//calcular los lados del rectangulo B
leftB = B.x;
rightB = B.x + B.w;
topB = B.y;
bottomB = B.y + B.h;
//Si alguno de los lados de A esta 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 de A esta fuera de B
return true;
}
void PJ_PARADO ()
{
if (TECLAS [SDLK_LEFT])
PJ_CAMBIAR_ESTADO (2);
if (TECLAS [SDLK_RIGHT])
PJ_CAMBIAR_ESTADO (3);
if (TECLAS [SDLK_x])
PJ_CAMBIAR_ESTADO (4);
}
void PJ_IZQUIERDA ()
{
PERSONAJE_MOVER(-2);
if (! TECLAS [SDLK_LEFT])
PJ_CAMBIAR_ESTADO (1);
if (TECLAS [SDLK_x])
PJ_CAMBIAR_ESTADO (4);
}
void PJ_DERECHA ()
{
PERSONAJE_MOVER ( +2);
if (! TECLAS [SDLK_RIGHT])
PJ_CAMBIAR_ESTADO ( 1);
if (TECLAS [SDLK_x])
PJ_CAMBIAR_ESTADO ( 4);
}
void PJ_SALTANDO()
{
PJ_R.y += VEL_INICIAL >> 2;
VEL_INICIAL ++;
if (TECLAS [SDLK_LEFT])
PERSONAJE_MOVER (-2);
if (TECLAS [SDLK_RIGHT])
PERSONAJE_MOVER ( +2);
if( COLISION( PJ_R, PLATA_R ) )
{
PJ_R.y -=2;
PJ_R.x -=2;
PJ_CAMBIAR_ESTADO ( 1 );
VEL_INICIAL=1;
}else PJ_R.y++;
if (PJ_R.y +50> 600)
{
PJ_R.y-=2;
PJ_CAMBIAR_ESTADO ( 1 );
}
if( COLISION( PJ_R, PLATA_R2 ) )
{
PJ_R.y -=2;
PJ_R.x -=2;
PJ_CAMBIAR_ESTADO ( 1 );
VEL_INICIAL=1;
}else PJ_R.y++;
}
void PJ_CAMBIAR_ESTADO(int NUEVO)
{
ESTADO = NUEVO;
if (ESTADO == 4) { VEL_INICIAL = -50; }
}
void PERSONAJE_MOVER ( int VEL_X )
{
PJ_R.x += VEL_X;
if( ( PJ_R.x < 0 ) || ( PJ_R.x + 50 > 800 ))
{
PJ_R.x -= VEL_X;
}
}
void DIBUJAR_NUMERO(TTF_Font *FUENTE,int NUM,int x,int y,SDL_Surface * PANTALLA)
{
char TEXTO_CHAR[17];
SDL_Surface *TEXTO;
SDL_Rect TEXTO_RECTA;
SDL_Color COLOR={255,255,0};
sprintf(TEXTO_CHAR,"%d",NUM);
TEXTO = TTF_RenderText_Solid( FUENTE, TEXTO_CHAR , COLOR );
TEXTO_RECTA.x = x;
TEXTO_RECTA.y = y;
TEXTO_RECTA.h = TEXTO->h;
TEXTO_RECTA.w = TEXTO->w;
SDL_BlitSurface(TEXTO, NULL,PANTALLA, &TEXTO_RECTA);
SDL_FreeSurface(TEXTO);
}