2011-11-06 13 views
5

Estoy cargando el archivo PNG (con algunos lugares transparentes) en mi aplicación SDL.SDL_image Error de transparencia PNG

buscar en Google sobre cómo hacer que me dio este ejemplo de código:

SDL_Surface *LoadImage(std::string filename) 
{ 
    SDL_Surface* loaded_image = 0, compatible_image = 0; 

    if (!filename.c_str()) 
     return 0; 

    loaded_image = IMG_Load(filename.c_str()); 

    if (!loaded_image) 
     return 0; 

    compatible_image = SDL_DisplayFormat(loaded_image); 

    SDL_FreeSurface(loaded_image); 

    return compatible_image; 
} 

Pero cuando se alcanza la línea compatible_image = SDL_DisplayFormat(loaded_image);, la aplicación se detiene con una excepción inalcanzable (incluso try { /* ... */ } catch (...) { /* ... */ } no ayuda). Reemplazar SDL_DisplayFormat() con SDL_DisplayFormatAlpha() tampoco ayudó. Por lo tanto, acaba de quitar las líneas de excepción-trowable y obtener el código de trabajo para cargar imágenes:

SDL_Surface *LoadImage(std::string filename) 
{ 
    if (!filename.c_str()) 
     return 0; 

    return IMG_Load(filename.c_str()); 
} 

y he encontrado tal cosa desagradable: cuando algunos sprites se solapa con piezas transparentes de otro, aparecen artefactos. Algo como esto:

normal state

artifacts appearing

Estoy animando a mi "héroe" con este sencillo algoritmo:

// SDL_Surface sprite = LoadImage("hero.bmp"); 
// hero.bmp contains animation frames followed one-by-one in a single line 
// spriteFrameCnt is a number of animation frames 
// spriteWidth and spriteHeight contain single frame params 

SDL_Rect srcRect; 
srcRect.x = spriteFrame * spriteWidth; 
srcRect.w = spriteWidth; 
srcRect.y = 0; 
srcRect.h = spriteHeight; 
spriteFrame = ++spriteFrame % spriteFrameCnt; 

SDL_BlitSurface(sprite, &srcRect, screen, &rcSprite); 

¿Cómo se puede explicar esto y se fija?

Respuesta

1

Encontrado una solución: cuando se dibuja una ficha con piezas transparentes y se dibuja otro elemento en la parte superior de la primera, aparecen artefactos. ¡Claro que lo harán, porque nada está detrás de ese primer espíritu!

La primera y más rápida solución es llenar todo el fondo con un poco de color antes de cualquier otra embestida.

La segunda y más bella forma (en mi caso) es dibujar alguna imagen de fondo (pasto como se muestra).

Éstos son los resultados:

first example

second example

Como se puede ver, no hay artefactos que aparecen. ¡Bien hecho, yo! =)

1

No estoy seguro si este es el problema, pero debe asegurarse de que está llamando antes de SDL_Init SDL_DisplayFormat

+0

Sí, ahora no se lanza la excepción. Gracias a ti. Pero los artefactos no desaparecieron sin importar cómo intente ... – shybovycha

6

Uso SDL_DisplayFormatAlpha en lugar de SDL_DisplayFormat. Conserva adecuadamente la transparencia.

Cuestiones relacionadas