私は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);
:
私はこの単純なアルゴリズムで私の "英雄" をアニメーション化するのですか?これは問題ですが、SDL_DisplayFormat
ええ、今例外はスローされません。おかげさまで。しかし、どのように試してもアーティファクトは消えませんでした... – shybovycha