假设我们有一个 32 位 PNG 文件,其中包含一些幽灵/虚体字符,它以半透明方式绘制。它并非在每个地方都同样透明,因此在将其加载到表面时,我们需要每个像素的 alpha 信息。
对于淡入/淡出,设置整个表面的 alpha 值是一个好方法;但不是在这种情况下,因为表面已经具有每像素信息,而 SDL 没有将两者结合起来。
什么是有效的解决方法(而不是要求艺术家为角色提供一些很棒的淡入/淡出动画)?
我认为实现所需结果的最简单方法是首先加载source
包含角色精灵的表面,然后为每个幻影实例创建working
表面的副本。您要做的是每次实例的 alpha 值发生变化时,SDL_BlitSurface
(doc)您source
的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_gfx
(这里),但如果你只这样做,我不会为此而费心链接库。