Problemas con "scrolling" SDL,C++

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

Problemas con "scrolling" SDL,C++

Notapor mcmakia.696 » Mar Feb 14, 2012 12:47 am

Hola.tengo un problema con este programa,lo que pasa es que quiero hacer un scroll,osea que la camara siga al pj pero no logro hacerlo "bien".osea funciona, pero funciona mal,el "TERRENO" deja rastros en la pantalla y la camara no sigue al "PJ" como deberia.que pasa cual es el problema?.Aqui les dejo el codigo:

*NOTA:no utilizo POO por que me enredo anunque si se utilizarla :roll:

Código: Seleccionar todo

#include <SDL.h>
#include <SDL_image.h>

SDL_Surface *PANTALLA = NULL;
SDL_Surface *OJAG = NULL;
SDL_Surface *TERRENO = NULL;
SDL_Rect MURO;
SDL_Rect OJAG_R;
SDL_Rect TERRENO_R;
SDL_Rect CAMARA;
SDL_Event EVENTO;
int vel = 3;
int VELX, VELY;
bool FIN = false;

/*******************************************/

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

/***************************************/

int main( int argc, char* args[] ){

   SDL_Init(SDL_INIT_EVERYTHING);
   PANTALLA = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE);
   OJAG = SDL_LoadBMP("pj_1.bmp");
   TERRENO = SDL_LoadBMP("terreno.bmp");
   

   OJAG_R.x = 0;
   OJAG_R.y = 0;
   OJAG_R.w = OJAG->w;
   OJAG_R.h = OJAG->h;

   TERRENO_R.x = 0;
   TERRENO_R.y = 0;
   TERRENO_R.w = TERRENO->w;
   TERRENO_R.h = TERRENO->h;

   MURO.x = 90;
   MURO.y = 300;
   MURO.w = 400;
   MURO.h = 30;

   CAMARA.x = 0;
   CAMARA.y = 0;
   CAMARA.w = 800;
   CAMARA.h = 600;

   while( FIN == false )
    {
       
      

        while( SDL_PollEvent( &EVENTO ) )
        {
         
         if( EVENTO.type == SDL_QUIT ){ FIN = true; }
         

         if( EVENTO.type == SDL_KEYDOWN )
         {
            switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VELY -= vel; break;
            case SDLK_DOWN: VELY += vel; break;
            case SDLK_LEFT: VELX -= vel; break;
            case SDLK_RIGHT: VELX += vel; break;
         
         
        }
         
         }

         else if( EVENTO.type == SDL_KEYUP )
         {
       
            switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VELY += vel; break;
            case SDLK_DOWN: VELY -= vel; break;
            case SDLK_LEFT: VELX += vel; break;
            case SDLK_RIGHT: VELX -= vel; break;
        }
         }

         if(EVENTO.key.keysym.sym == SDLK_ESCAPE){ FIN =1; }
         
       
      }

      OJAG_R.x+= VELX;
      OJAG_R.y+= VELY;

      if(OJAG_R.x<=0){OJAG_R.x=0;}
      if(OJAG_R.y<=0){OJAG_R.y=0;}
      if(OJAG_R.x+90>=800){OJAG_R.x-= VELX;}
      if(OJAG_R.y+115>=600){OJAG_R.y-= VELY;}

      CAMARA.x = ( OJAG_R.x + 90  /2 ) - 800 /2;
      CAMARA.y = ( OJAG_R.y + 115 /2 ) - 600 /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; }
   
      if( COLISION( OJAG_R,MURO) ){ OJAG_R.x -= VELX; }
      if( COLISION( OJAG_R,MURO) ){ OJAG_R.y -= VELY; }
      

      //SDL_FillRect( PANTALLA, &PANTALLA->clip_rect, SDL_MapRGB( PANTALLA->format, 0xFF, 0xFF, 0xFF ) );
      SDL_BlitSurface(TERRENO, NULL, PANTALLA, &CAMARA);
      SDL_FillRect( PANTALLA, &MURO, SDL_MapRGB( PANTALLA->format, 0x77, 0x77, 0x77 ) );
      SDL_BlitSurface(OJAG, NULL, PANTALLA, &OJAG_R);
      
      SDL_Flip( PANTALLA );

 
       
    }

   SDL_FreeSurface(TERRENO);
   SDL_FreeSurface(OJAG);
   SDL_Quit();

    return 0;
}







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

Re: Problemas con "scrolling" SDL,C++

Notapor quiro9 » Mié Feb 15, 2012 12:29 pm

Hola, solucionarte el código seria hacer mal a tu lógica y no hacerte pensar! jajaja,
tampoco tengo tiempo y no se mucho de SDL, pero acá tenes un ejemplo para descargarte que quizás te sirva (es un tanquesito que moves por la pantalla y hace scroll)

http://www.losersjuegos.com.ar/_media/r ... oll.tar.gz

esta en los ejemplos de esta misma web (tenes otros que pueden ser de tu interes)...
http://www.losersjuegos.com.ar/referencia/ejemplos

los ejemplos son bastantes claros en mi opinion (si entendes C y SDL aunque sea minimamente)... SALUDOS, espero que te sirva
solo software y hardware libressss!
(VIDA LIBRE, PARA EL USUARIO Y PROGRAMADOR!!!)
Avatar de Usuario
quiro9
 
Mensajes: 18
Registrado: Dom Dic 04, 2011 6:30 pm

Re: Problemas con "scrolling" SDL,C++

Notapor mcmakia.696 » Mié Feb 15, 2012 2:43 pm

Ohh gracias tio creo que me servira un poco ,pero me llevara un poco de tiempo entender y analizar como funciona. Arigatō¡¡¡
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