sdl - SDL2 中的纹理渐变 - 使用 SDL_image

标签 sdl sdl-image

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

任何人都可以在保持良好性能的同时提供帮助吗?

最佳答案

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

函数本身已记录 here

注意。渲染器并不总是支持 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 是一个 float ,用于存储从 0 到 255 逐渐增加的值。更新函数的每次调用都会看到这个值更新为缩放值 FADE_SPEED 乘以帧时间过去。然后将其分配给实际的 alpha 值。这样做是为了保持平滑淡入淡出,因为整数舍入可防止仅使用 alpha 值进行平滑淡入淡出。

关于sdl - SDL2 中的纹理渐变 - 使用 SDL_image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752122/

相关文章:

image - "Undefined Reference To ' IMG_Load '"代码块和 SDL_Image 错误

sdl-image - SDL_image 的 IMG_Load 不起作用

c++ - 有没有更好的方法来加载大动画?

c - 使用 SDL_image 加载 BMP 图像问题

c - 需要帮助处理 C 中的二维结构数组

c++ - 我的电脑缺少 SDL.dll - VS 2010

c++ - SDL 和 Visual Studio 2010 资源

c++ - 如何修复 'The procedure entry point SDL_RWclose could not be located in the dynamic link library'

c - 如果已经按下了向下+向右或向上+向左,则没有空格键的 SDL 事件

c - 读取 C 中的按键;前任。 : Arrow keys, 回车键