2011-11-06 19 views
5

私はSDLアプリケーションにPNGファイル(いくつかの透明な場所を含む)をロードしています。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_DisplayFormat()SDL_DisplayFormatAlpha()に置き換えると、あまり役に立ちませんでした。だから、私はちょうど例外trowable行を削除し、画像をロードするために働いて、このコードを取得する:

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

    return IMG_Load(filename.c_str()); 
} 

を、私は、このような不快なものを見つけた:いくつかのスプライトが別の1の透明部分と重なった場合、アーティファクトが表示されます。何かのように:これは説明して固定することができますどのように

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

normal state

artifacts appearing

私はこの単純なアルゴリズムで私の "英雄" をアニメーション化するのですか?これは問題ですが、SDL_DisplayFormat

答えて

1

解決策を見つけました:透明な部分を含むタイルが描画され、最初のスプライトの上に別のスプライトが描画されると、アーティファクトが表示されます。確かに彼らは、その最初のスプライトの後ろに何もないので!

最初の最も速い修正は、それ以上のブリッティングを行う前に背景全体を何らかの色で塗りつぶすことです。

私の場合、2番目に美しい方法は、背景画像(図示のように草)を描くことです。あなたが見ることができるように、何の成果物が表示されていない

first example

second example

は、ここでの結果です。まあ、私! =)

1

わかりません。透明性が適切に維持されます。

+0

ええ、今例外はスローされません。おかげさまで。しかし、どのように試してもアーティファクトは消えませんでした... – shybovycha

6

利用SDL_DisplayFormatAlphaの代わりSDL_DisplayFormat前にSDL_Initを呼び出していることを確認する必要がある場合

関連する問題