我可以使用 SDL_image 毫无问题地加载(png)图像,并且可以完美地显示它。不过,我想做的是将图像从完全透明逐渐淡入完全不透明。我看过一些教程提到SDL_SetAlpha
,但这是用于SDL_Surface
SDL_image 加载的地方,就像SDL_Texture
硬件加速一样。
任何人都可以在保持良好性能的同时帮助解决这个问题吗?
所以这就是我发现的。要使用 alpha 渲染纹理,您只需调用SetTextureAlphaMod
一个指向纹理的指针和一个 0 - 255 范围内的整数。
函数本身记录在这里
注意。渲染器并不总是支持 Alpha 调制,如果是这种情况,函数将返回 -1(成功调用返回 0)。函数文档中有关于如何检测渲染器是否支持 alpha 调制的信息。
我的问题的下一部分是如何执行从 SDL_TRANSPARENT (0) 到 SDL_OPAQUE (255) 的平滑渐变。我在我的变量更新函数中做到了这一点(游戏使用固定和变量更新)
#define FADE_SPEED 0.07f;
void SomeClass::UpdateVariable(float elapsedTime)
{
// Check there is a texture
if (texture) {
// Set the alpha of the texture
SDL_SetTextureAlphaMod(texture, alpha);
}
// Update the alpha value
if (alpha < SDL_ALPHA_OPAQUE) {
alphaCalc += FADE_SPEED * elapsedTime;
alpha = alphaCalc;
}
// if alpha is above 255 clamp it
if (alpha >= SDL_ALPHA_OPAQUE) {
alpha = SDL_ALPHA_OPAQUE;
alphaCalc = (float)SDL_ALPHA_OPAQUE;
}
}
注意使用两个 alpha 变量。alpha
是传递给用于控制纹理 alpha 的函数的实际值,是一个 Uint8。alphaCalc
是一个浮点数,用于存储从 0 到 255 逐渐增加的值。更新函数的每次调用都会看到这个值更新为缩放器值FADE_SPEED
乘以经过的帧时间。然后将其分配给实际的 alpha 值。这样做是为了保持平滑淡入淡出,因为整数舍入可防止仅使用 alpha 值进行平滑淡入淡出。