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:
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?
Sì, ora l'eccezione non viene lanciata. Grazie a te. Ma gli artefatti non sono andati via, non importa quanto provi ... – shybovycha