2011-11-06 13 views
5

PNG dosyasını (bazı saydam yerlerle) SDL uygulamasına yüklüyorum.SDL_image PNG şeffaflık hatası

bu kod örneği ile bana verilen nasıl yapılacağına ilişkin Googling:

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

Ama çizgi compatible_image = SDL_DisplayFormat(loaded_image); ulaşıldığında, uygulama, uncatchable hariç durur (hatta try { /* ... */ } catch (...) { /* ... */ } yardımcı olmuyor). 'un SDL_DisplayFormatAlpha() ile değiştirilmesi de yardımcı olmadı. Yani, ben sadece istisna-trowable hatları kaldırıldı ve görüntüleri yüklemek için çalışan bu kodu almak:

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

    return IMG_Load(filename.c_str()); 
} 

Ve böyle nahoş bir şey buldum: Bazı peri başka birinin şeffaf parçaları ile üst üste bindiğinde, eserler görünür. Böyle bir şey:

normal state

artifacts appearing

Ben bu basit algoritma ile benim "kahraman" animasyon ediyorum:

// 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); 

Bu nasıl açıklanabilir ve düzeltilebilir? Bu sorun, ama sen SDL_DisplayFormat

cevap

1

Çözüm bulundu: Şeffaf parçalara sahip bir kiremit çekildiğinde ve birincinin üstünde başka bir hareketli çizgi çizildiğinde, görüntüler görüntülenir. Tabii ki yapacaklar, çünkü hiçbir şey bu ilk sprite'ın arkasında değil!

İlk ve en hızlı düzeltme, arka planı daha önce tüm renklerini bir renkle doldurmaktır.

İkinci ve en güzel yol (benim durumumda) bazı arka plan görüntüsü çizmek (gösterilen şekilde). Gördüğünüz gibi, hiçbir eserler görünen

first example

second example

:

İşte sonuçlarıdır. Iyi yaptım! =)

1

emin değilim. Şeffaflığı düzgün şekilde korur.

+0

Evet, şimdi istisna atılmadı. Sayende. Ama eserler, nasıl denerim olursa olsun gitmedi. – shybovycha

6

Kullanım SDL_DisplayFormatAlpha yerine SDL_DisplayFormat önce SDL_Init aradığınız emin olmalısınız eğer