2011-11-06 284 views
5

我正在加載PNG文件(帶有一些透明的地方)到我的SDL應用程序中。SDL_image PNG透明度錯誤

谷歌搜索如何做這個代碼示例爲我提供了:

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

但在達到行compatible_image = SDL_DisplayFormat(loaded_image);時,應用程序與一個不可捕獲的異常中止(甚至try { /* ... */ } catch (...) { /* ... */ }沒有幫助)。用SDL_DisplayFormatAlpha()代替SDL_DisplayFormat()也沒有幫助。所以,我只是刪除了異常trowable線和得到這個代碼的工作載入圖像:

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

    return IMG_Load(filename.c_str()); 
} 

,我已經發現了這樣不愉快的事情:當一些精靈與另一個的透明片重疊,文物出現。事情是這樣的:

normal state

artifacts appearing

我動畫我的 「英雄」 這個簡單的算法:

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

這又如何解釋和解決嗎?

回答

1

找到了一個解決方案:當繪製一個帶有透明件的圖塊,並在第一個圖塊的頂部繪製另一個圖元時,出現工件。當然,他們會這樣做,因爲第一個精靈背後沒有任何東西!

第一個也是最快速的修復方法是在任何進一步的blitting之前用一些顏色填充整個背景。

第二個也是最漂亮的方法(在我的情況下)是繪製一些背景圖像(如圖所示)。

下面是結果:

first example

second example

正如你所看到的,沒有文物出現。幹得好,我! =)

1

不知道這是否是問題,但SDL_DisplayFormat

+0

是的,現在不會拋出異常。謝謝你。但是無論我怎麼嘗試,文物都不會消失...... – shybovycha

6

使用SDL_DisplayFormatAlpha而不是SDL_DisplayFormat之前,你應該確保你打電話SDL_Init。它適當地保留了透明度。