Optimizacion con DirtyRectangles SDL C++

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

Optimizacion con DirtyRectangles SDL C++

Notapor mcmakia.696 » Mar Abr 24, 2012 5:20 pm

hola, yo de nuevo.jejeje.lo que pasa es que ya tengo los conocimientos minimos para hacer un juego al menos respetable.pero para lograr eso necesito optimizar el dibujado en pantalla de los sprites que se mueven.eh pillado en ejemplos del foro la tecnica dirtyrectangles y eh tratado de estudiarla pero no logro entenderla por que tiene cosas un poco avanzadas para mi.si es posible,quiero que me den un ejemplo sencillo o alguna pagina o que modifiquen el codigo que puse aqui. entendere mejor el ejemplo si las funciones no estan separadas del proceso principal.finjence en el codigo que les dejo, todas las funciones y datos estan declaradas globalmente, exepto la funcion TECLADO():

Código: Seleccionar todo

//LIBRERIAS
#include <stdio.h>
#include <SDL.h>

void TECLADO();

//SUPERFICIES
SDL_Surface *PANTALLA;
SDL_Surface *FONDO;
SDL_Surface *PJ;

//EVENTOS
SDL_Event EVENTO;

//RECTANGULOS
SDL_Rect FONDO_R;
SDL_Rect PJ_R;

//VARIABLES GLOBALES
bool SALIR = false;
char TITULO[]="PRUEBA DE OPTIMIZACION #1";
int VEL = 3;
int VEL_X = 0;
int VEL_Y = 0;
const int PJ_ALTO = 50;
const int PJ_ANCHO = 50;

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

   SDL_Init( SDL_INIT_VIDEO );
   SDL_WM_SetCaption( TITULO, NULL );
   PANTALLA = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
   FONDO = SDL_LoadBMP("fondo.bmp");
   PJ = SDL_LoadBMP("pj.bmp");

   //UBICACION DEL PJ
   PJ_R.x = 0;
   PJ_R.y = 0;
   PJ_R.w = PJ_ALTO;
   PJ_R.h = PJ_ANCHO;

   //UBICACION DEL FONDO
   FONDO_R.x = PJ_R.x;
   FONDO_R.y = PJ_R.y;
   FONDO_R.w = FONDO->w;
   FONDO_R.h = FONDO->h;
   
   while( SALIR == false )
    {
      while( SDL_PollEvent( &EVENTO ) )
        {

         //EVENTOS DEL TECLADO
         TECLADO();
         if( EVENTO.type == SDL_QUIT ){ SALIR = true; }
         if(EVENTO.key.keysym.sym == SDLK_ESCAPE ){ SALIR = true;}

      }//FIN WHILE #2

      PJ_R.x += VEL_X;
      PJ_R.y += VEL_Y;

      if(PJ_R.x<0)PJ_R.x=0;
      if(PJ_R.x+50>640)PJ_R.x-= VEL_X;
      if(PJ_R.y<0)PJ_R.y=0;
      if(PJ_R.y+50>480)PJ_R.y-= VEL_Y;
      
      SDL_BlitSurface(FONDO,NULL,PANTALLA,&FONDO_R);
      SDL_BlitSurface(PJ,NULL,PANTALLA,&PJ_R);
      SDL_Flip(PANTALLA);
      

   }//FIN WHILE #1

   SDL_FreeSurface(FONDO);
   SDL_FreeSurface(PJ);
   SDL_Quit ();
return 0;
}

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

void TECLADO(){

if( EVENTO.type == SDL_KEYDOWN )
    {
        switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VEL_Y -= VEL; break;
            case SDLK_DOWN: VEL_Y += VEL; break;
            case SDLK_LEFT: VEL_X -= VEL; break;
            case SDLK_RIGHT: VEL_X += VEL; break;
      }
    }
   
    else if( EVENTO.type == SDL_KEYUP )
    {
        switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VEL_Y += VEL; break;
            case SDLK_DOWN: VEL_Y -= VEL; break;
            case SDLK_LEFT: VEL_X += VEL; break;
            case SDLK_RIGHT: VEL_X -= VEL; break;
      }
    }

}


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

Re: Optimizacion con DirtyRectangles SDL C++

Notapor kingwar » Dom May 06, 2012 1:39 am

:shock: :o :x

¿que estas estudiando (como profesion)? :|

recomendaciones (que vendrian siendo mejor obligaciones)...
"Buenas practicas de programacion"
*los nombres de funciones no deben estar todos en mayuscula
*NO declarar variables globales solo a caso de muerte propia sino se hace
*no utilizar sentencias goto
*los nombres de variables no deben estar todos en mayuscula a menos que sean CONSTANTES y de ser así si el lenguaje lo dispone explicitarlos como tal.
*comprobar si las inicializaciones fueron correctas.
*... :? :?
"pero si estudias computacion deberias saber manejar todos los programas" conclusion:usuario no es gente

-linkingcrk- http://baulprogramas.blogspot.com/
Avatar de Usuario
kingwar
 
Mensajes: 35
Registrado: Dom Abr 10, 2011 9:32 pm
Ubicación: Venezuela-Miranda

Re: Optimizacion con DirtyRectangles SDL C++

Notapor sofoke » Lun May 14, 2012 1:12 am

Bueno eso de limpiar los ratros que deja el sprite del personaje (ya sea nave, carro, humano, etc..) se puede solucionar haciendo un rectangulo de color del fondo, asi; de este modo limpiamos el rastro. Ahora no se; quiza haya mejores formas de hacerlo pero, yo prefiero hacer un rectangulo de 'x' color que ocupe toda la pantalla:
Código: Seleccionar todo
void ClrscSdl( SDL_Surface* Screen ){
   SDL_Rect PosScr;
   PosScr.x = 0;
   PosScr.y = 0;
   PosScr.w = Screen -> w;
   PosScr.h = Screen -> h;
   SDL_FillRect( Screen, &PosScr, SDL_MapRGB( Screen -> format, 0, 0, 0) );
   return;
}

Y asi llamo una vez por ciclo en el loop principal a la funcion ClrscSdl y le mando la superficie principal. Claro si el juego tiene un fondo que se compone de imagnes, sprites, etc... creo que al dibujar el mismo fondo se resolveria el problema.
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados