Continuamos con el pdf Tutorial de libSDL para la programación de videojuegos y sacándole mucho jugo, ¡cada vez más animado para hacer un juego! ¿Es posible que al terminar el pdf tenga ya uno?
Mapas de bits
Con SDL_Rect definimos el tamaño del cuadrado a copiar y la posición
Cargamos una imagen con el siguiente método, el cual devuelve NULL ante problemas.
SDL_Surface *SDL_LoadBMP(const char *file);
Si lo necesitamos, podemos guardarlo con el método:
int SDL_SaveBMP(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); // cero = correcto, -1=incorrecto
Recordando el blitting y flipping necesario para el dibujo en pantalla
void SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
int SDL_Flip(SDL_Surface *screen);
Para liberar la superficie
void SDL_FreeSurface(SDL_Surface *surface);
Transparencias - el color clave
Las transparencias pueden ser muy necesarias, por ejemplo cuando mostramos un personaje no queremos que se vea el fondo. Con el color key, podemos establecer un color como clave que no ha de dibujar.
Por ello, los color key suelen ser colores poco usados, que no están en el dibujo, como puede ser el verde puro o el magenta.
Para establecer el color key de una superficie usamos:
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
El cual devuelve cero si todo correcto, -1 al contrario. Los flags tenemos:
- 0 para desactivar una transparencia
- SDL_SRCCOLORKEY - el color del tercer parámetro es el que queremos quitar
- SDL_RLEACCEL - nos permite usar codificación RLE (Run Length Encoded) en la superficie para acelerar el blitting. Evita redundancia de almacenamiento y envío de datos. Para usarlo es estricto combinarlo SDL_SRCCOLORKEY
PD: Ya, ya sé que este post en comparación a los anteriores ha sido muy corto. Lo actualizaré en cuanto tenga algo más.
ACTUALIZADO
Transparencias - Canal Alpha
También se puede aplicar la transparencia en distintos grados (ALpha-Blendign), definido en un rango de cero a 255 donde cero es totalmente transparente.
int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha);
Tiene los mismo flags que colorkey, cambiando SDL_SRCCOLORKEY por SDL_SRCALPHA.
El problema que tiene esto es que tiene que leer los colores destino, es bastante más lento ya que tiene que usar el software.
Clipping
Es un añadido al blitting que consiste en establecer una zona donde se realiza el blitting, de esta forma no tenemos que redibujar en sitios que no vamos a modificar.
void SDL_SetClipRect(SDL_Surface *surface, SDL_Rect *rect);
Aunque pongamos rect más grande que la superficie, se limita de forma automática.
void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect);
Conversión de formatos de píxel
Para convertir imágenes a un formato y así unificarlo
SDL_Surface *SDL_ConvertSurface(SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags);
//para convertir al formato de la pantalla
SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface); //para convertir al formato de la pantalla