Curso programación de videojuegos con SDL – Mejorando aspectos gráficos

Habréis podido observar que los aviones parpadean al moverse por la pantalla. Esto se produce porque dibujamos directamente sobre la pantalla, es decir sobre lo que hemos llamado screen, de manera que dibujamos antes unos objetos y luego otros. Este problema es bien sencillo de solucionar con SDL gracias a la llamada técnica del doble búfer que nos ofrece. Mediante esta técnica dibujaremos sobre un búfer en el que una vez dibujados todos lo necesario, pasaremos a dibujar sobre el screen, de esta manera eliminaremos el parpadeo que creaba la técnica anterior.

Expliquemos la implementación de esta técnica sobre nuestro ejemplo:

  1. Declamos un puntero a una variable del tipo SDL_Surface sobre la que “dibujaremos” y despues volcaremos sobre el screen:
    SDL_Surface *buffer;
  2. Creamos este buffer:
    buffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480, 16,0,0,0,0);
  3. Le indicamos al screen que vamos a usar la técnica de doble búfer:screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
  4. Dibujamos los componentes del juego, fondo, jugador y enemigos sobre el búfer:
    SDL_BlitSurface(fondo, NULL, buffer, &posicion);
    SDL_BlitSurface(jugador, NULL, buffer, &posicion);
    SDL_BlitSurface(enemigos[i], NULL, buffer, &posicion);
  5. Volcamos sobre la pantalla:
    posicion.x=0;
    posicion.y=0;
    SDL_BlitSurface(buffer, NULL, screen, &posicion);
    SDL_Flip(screen);

No mostramos el código completo, porque como estos cambios han sido menores y son fácilmente identificables. Para terminar esta entrada del curso sólo comentar cómo sería el caso de que quisiéramos hacer que el juego se ejecutase en pantalla completa en lugar de en una ventana. Con SDL solamente tendríamos que incluir en el último parámetro SDL_FULLSCREEN:

screen = SDL_SetVideoMode( 640, 480, 16, SDL_FULLSCREEN | 
SDL_HWSURFACE | SDL_DOUBLEBUF);

Como podéis observar los valores se incluyen con OR lógicos (|).