SDL2中的纹理衰落 - 使用SDL_image

时间:2013-04-01 21:22:05

标签: sdl sdl-image

我可以使用SDL_image在(png)加载图像没问题,并且也可以完美地显示它。我想做的是逐渐淡化图像从完全透明到完全不透明。我看过一些提及SDL_SetAlpha的教程,但这是用于SDL_Surface,其中SDL_image加载为SDL_Texture用于硬件加速。

任何人都可以在保持良好性能的同时帮助解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

所以这就是我发现的。要使用alpha渲染纹理,您只需要调用SetTextureAlphaMod传入一个指向纹理的指针和一个0到255范围内的整数。

函数本身记录在here

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;
    }
}

注意使用两个alpha变量。 alpha是传递给控制纹理alpha的函数的实际值,是Uint8。 alphaCalc是一个浮点数,用于存储从0到255逐渐增加的值。更新函数的每次调用都会通过缩放器值FADE_SPEED乘以经过的帧时间来看到此值更新。然后将其分配给实际的alpha值。这样做是为了保持平滑的淡入淡出,因为整数舍入可以单独使用alpha值来防止平滑淡入淡出。