C ++ / SDL:淡出已经具有每像素alpha信息的表面

时间:2013-05-29 13:48:12

标签: c++ sdl alpha fading

假设我们有一个32位的PNG文件,它有一些幽灵/无形的字符,它是以半透明的方式绘制的。它在每个地方都不是同等透明的,因此在将其加载到曲面时我们需要每像素的alpha信息。

对于淡入/淡出,设置整个表面的alpha值是一个好方法;但不是在这种情况下,因为表面已经具有每像素信息而SDL不会将两者结合起来。

什么是有效的解决方法(而不是要求艺术家为角色提供一些非常棒的淡入/淡出动画)?

1 个答案:

答案 0 :(得分:1)

我认为实现所需结果的最简单方法是首先加载包含角色精灵的source曲面,然后为幽灵的每个实例创建working副本表面。您要做的是每次实例的Alpha值将SDL_BlitSurfacedocsource更改为working副本,然后应用透明度(你可能应该保持0到1之间的浮点数,然后在每个像素的alpha通道上应用透明度。

对于32位曲面,假设您最初加载source并分配working SDL_Surface s,您可以执行以下操作:

SDL_BlitSurface(source, NULL, working, NULL);
if(SDL_MUSTLOCK(working)) 
{
    if(SDL_LockSurface(working) < 0) 
    {
        return -1;
    }
}

Uint8 * pixels = (Uint8 *)working->pixels;
pitch_padding = (working->pitch - (4 * working->w));
pixels += 3; // Big Endian will have an offset of 0, otherwise it's 3 (R, G and B)
for(unsigned int row = 0; row < working->h; ++row) 
{
    for(unsigned int col = 0; col < working->w; ++col) 
    {
        *pixels = (Uint8)(*pixels * character_transparency); // Could be optimized but probably not worth it
        pixels += 4;
    }
    pixels += pitch_padding;
}

if(SDL_MUSTLOCK(working)) 
{
    SDL_UnlockSurface(working);
}

此代码的灵感来自于SDL_gfxhere),但如果您只是这样做,我就不会因此而烦恼地链接到库。