Coalisiones sobre plataformas despues de salto SDL C++

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Coalisiones sobre plataformas despues de salto SDL C++

Notapor mcmakia.696 » Vie Jun 29, 2012 5:16 pm

Hola colegas ,soy yo de nuevo,eh estado ausente por que me la paso progamando algoritmos y codigos para mis futuros proyectos y me tope con esto.yo hice un programa en donde un PJ salta y luego cae en el suelo.el suelo es solo un restriccion de movimiento en que si por ejemplo:

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);
}



mcmakia.696
 
Mensajes: 16
Registrado: Lun Feb 13, 2012 6:10 pm

Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron