Programación para Juegos – Lección 5

05/04/2019Artículo original

Lo que vamos a ver ahora son los colores clave. Un color clave es un color que no queremos que aparezca en la imágen, como el fondo de la misma. La estructura SDL_Surface tiene un elemento llamado color key , que determina que color de la imagen no queremos que sea visible. Esto es lo que se usa cuando queremos una imagen con fondo transparente.

Pueden descargar el código fuente de esta lección.

Bien, supongamos que queremos fusionar esta imagen llamada foo:

foo

a este fondo:

Imagen Fondo

Pero no queremos que aparezca el fondo azul claro de la primera imagen:

Resultado

Para que no se muestre el fondo de la primera imagen, necesitamos fijarlo como color key, en este caso el valor de este color es (En hexadecimal): Red 0, Green FF, Blue FF.El color key se suele fijar normalmente al cargar la imagen.

SDL_Surface*load_image(std::stringfilename){//The image that's loadedSDL_Surface*loadedImage=NULL;//The optimized image that will be usedSDL_Surface*optimizedImage=NULL;//Load the imageloadedImage=IMG_Load(filename.c_str());//If the image loadedif(loadedImage!=NULL){//Create an optimized imageoptimizedImage=SDL_DisplayFormat(loadedImage);//Free the old imageSDL_FreeSurface(loadedImage);

Esta es la función que carga la imagen, y que vamos a modificar.

  Entrevista a Javier Cantón, el padre de Wave Engine

En primer lugar, cargamos la imagen optimizada, como hacíamos hasta ahora.

//If the image was optimized just fineif(optimizedImage!=NULL){//Map the color keyUint32colorkey=SDL_MapRGB(optimizedImage->format,0,0xFF,0xFF);

Comprobamos que la imagen fue optimizada.Si todo va bien, necesitamos mapear el color que queremos ocultar. Llamamos a SDL_MapRGB() para tomar los valores de rojo, verde y azul. Esta función nos devuelve el valor del pixel en el mismo formato que el de la imagen. Puedes leer más acerca de los pixeles en el artículo 3.

//Set all pixels of color R 0, G 0xFF, B 0xFF to be transparentSDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,colorkey);}

Ahora vamos a configurar el color Key, lo que vamos a hacer es fijar todos los pixeles de color 00ffff a transparentes.El primer argumento de esta función es la imagen para la cual queremos aplicar el color key.

El segundo es para los flags que desee aplicar, en este caso, el flag SDL_SRCCOLORKEY asegura que estamos usando color Key cuando fusionemos una imagen en otra.

  Ya está disponible .NET Core 2.1

El tercero es el color que deseamos fijar como color key, como vemos, es el color que hemos mapeado hace un momento.

//Return the optimized imagereturnoptimizedImage;}

Para finalizar, la función devuelve la imagen optimizada con el color clave.

//Apply the surfaces to the screenapply_surface(0,0,background,screen);apply_surface(240,190,foo,screen);//Update the screenif(SDL_Flip(screen)==-1){return1;}

El resultado de hacer todo esto da como resultado la imagen siguiente:

Imagen final

Como vemos, ahora en la imagen del hombrecillo de Palo ya no se ve el fondo azul claro.

Para aquellos que uséis imágenes PNGs con transparencia, IMG_Load() la maneja automáticamente. Si itentamos fijar un color clave para imágenes que ya disponen de transparencia, ocasionaremos resultado extraños. También se perderá la transparencia Alfa si usamos SDL_DisplayFormat() en lugar de SDL_DisplayFormatAlpha(). Para mantener la transparencia en un PNG simplemente no fije un color clave. IMG_Load() también se encarga del alfa de imágenes TGA. Busque en la documentación de SDL para obtener más información detallada sobre los colores clave.

  Programación Android
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad