我正在将一张PNG文件(其中有一些透明的区域)加载到我的SDL应用程序中。
在Google上搜索如何做到这一点,我找到了以下代码示例:
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()
也没有起作用。因此,我只好删除了可能引发异常的代码行,并得到如下可工作的图像加载代码:
SDL_Surface *LoadImage(std::string filename)
{
if (!filename.c_str())
return 0;
return IMG_Load(filename.c_str());
}
我发现一个很不愉快的事情:当一些精灵与另一个精灵的透明部分重叠时,会出现伪影。就像这样:
我正在使用这个简单算法对我的“英雄”进行动画处理:
// 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);
这个问题应该如何解释和修复?