我可以使用SDL_image在(png)加载图像没问题,也可以完美地显示它.我想做的是逐渐淡化图像从完全透明到完全不透明.我已经看到一些教程提到SDL_SetAlpha但这是用于SDL_SurfaceSDL_image加载SDL_Texture硬件加速的地方.
任何人都可以帮助我们在保持良好性能的同时如何做到这一点?
所以这就是我发现的.要使用alpha渲染纹理,您只需调用SetTextureAlphaMod传入指向纹理的指针和0到255范围内的整数.
NB.渲染器并不总是支持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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意使用两个alpha变量.alpha是传递给控制纹理alpha的函数的实际值,是Uint8.alphaCalc是一个浮点数,用于存储从0到255逐渐增加的值.更新函数的每次调用都会通过缩放器值FADE_SPEED乘以经过的帧时间来更新此值.然后将其分配给实际的alpha值.这样做是为了保持平滑的淡入淡出,因为整数舍入可以单独使用alpha值来防止平滑淡入淡出.