2011-11-06 16 views
5

Sto caricando il file PNG (con alcune posizioni trasparenti) nella mia applicazione SDL.SDL_image Errore di trasparenza PNG

Googling su come farlo mi ha fornito questo esempio di codice:

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; 
} 

Ma quando si raggiunge la linea compatible_image = SDL_DisplayFormat(loaded_image);, l'applicazione si arresta con un'eccezione non rilevabile (anche try { /* ... */ } catch (...) { /* ... */ } non aiuta). Sostituire SDL_DisplayFormat() con SDL_DisplayFormatAlpha() non ha aiutato anche. Allora, ho appena rimosso le linee di eccezione-spatolabile e ottenere questo codice di lavoro per caricare le immagini:

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

    return IMG_Load(filename.c_str()); 
} 

e ho trovato una cosa spiacevole: quando qualche sprite si sovrappone con pezzi trasparenti di un altro, appaiono artefatti. Qualcosa di simile a questo:

normal state

artifacts appearing

sto animare il mio "eroe" con questo semplice 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); 

Come può essere spiegato e fissati?

risposta

1

trovato una soluzione: quando una tessera con parti trasparenti viene disegnato ed un altro sprite è tracciata sulla parte superiore del primo, appaiono artefatti. Certo che lo faranno, perché nulla si nasconde dietro quel primo sprite!

Il primo e la correzione più-rapido è quello di riempire l'intero sfondo con un po 'di colore prima di qualsiasi ulteriore blittings.

Il secondo e il modo più bello (nel mio caso) è quello di trarre qualche immagine di sfondo (erba come indicato).

Ecco i risultati:

first example

second example

Come si può vedere, senza artefatti che appaiono. Ben fatto, io! =)

1

Non sono sicuro se questo è il problema, ma è necessario assicurarsi che si sta chiamando prima di SDL_Init SDL_DisplayFormat

+0

Sì, ora l'eccezione non viene lanciata. Grazie a te. Ma gli artefatti non sono andati via, non importa quanto provi ... – shybovycha

6

Uso SDL_DisplayFormatAlpha invece di SDL_DisplayFormat. Conserva correttamente la trasparenza.

Problemi correlati