Desarrollo de videojuegos en SDL III

Y seguimos con el tutorial de SDL de Antonio García Alba, las partes I y II por si os lo habéis saltado.


Manejo overlay
Crea un overlay. En caso de error devuelve NULL.
SDL_Overlay *SDL_CreateYUVOverlay(int width, int height, Uint32 format, SDL_Surface *display);


Libera el overlay
void SDL_FreeYUVOverlay(SDL_Overlay *overlay);


Antes de acceder a los datos del pixel, hay que bloquear y después desbloquear.
int SDL_LockYUVOverlay(SDL_Overlay *overlay); //cero si correcto, -1 al contrario void SDL_UnlockYUVOverlay(SDL_Overlay *overlay);


Para realizar dibujos en el overlay
int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); //cero si correcto, distinto si algún error



Blitting
Es el proceso de hacer blit (block transfer). Blit es la unidad hardware o software que se encarga de hacer el blitting. Se necesitan dos superficies y dos rectángulos de origen y destino
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

  • Si los rectángulos son null, se copia la superficie entera.
  • Cero si todo va bien, -1 si hay errores. Devuelve más valores, por ejemplo, -2 cuando al menos una superficie está en memoria de vídeo y se ha de refrescar para mostrar la imagen.
  • Si tienen distinto formato de pixel, lo cambia automáticamente, pero implica más carga.
  • El blitting por hardware es más rápido pero más limitado.

Flipping y doble búffer
Una vez formado la imagen con blitting, se actualiza la pantalla con SDL_UpdateRect(), pero tiene un pequeño problema, si se llama en mitad de la actualización de pantalla, mientras el monitor dibuja algo, por lo que se produce parpadeos y guiños (flicking).

Lo ideal es sincronizar el refresco, técnica conocida como sincronización de refresco vertical o VSYNC. Para ello se usa el doble búffer; dibujamos en una pantalla virtual y será mostrada con un intercambio de búfferes(flipping).

Para usarlo, llamaremos a SDL_Flip() en vez de a SDL_UpdateRect().


Manejo de superficies
Lo primero es ver si debemos bloquear la superfice antes de modificarlo. Para ello tenemos la función
int SDL_MUSTLOCK(SDL_Surface *surface);
el cual devuelve uno si debe ser bloqueada y cero en caso contrario.

Para bloquear se usa la función
int SDL_LockSurface();//cero si éxito, -1 al contrario

Hay que tener en cuenta los pitchs y big/little endian (cosa que podemos saber en la variable SDL_BYTEORDER) cuando manejemos los píxeles.

El desbloqueo se realiza con
void SDL_UnlockSurface(SDL_Surface *surface)


Y para el próximo dia tenemos.... ¡Código fuente!

Etiquetas: ,. Guarda el enlace permanente.

Deja un comentario ^^