SDL2中的纹理淡出 - 使用SDL_image

3
我可以使用SDL_image加载一张(png)图片并完美展示它,对此没有任何问题。但是我希望实现的是将图片从完全透明到不透明的渐变效果。我已经看过一些教程涉及到 SDL_SetAlpha,但这是在SDL_Surface上使用的,而SDL_image加载为硬件加速的 SDL_Texture
有人能帮忙解决如何在保持良好性能的情况下实现该功能吗?

3
你尝试过使用 http://wiki.libsdl.org/moin.fcg/SDL_SetTextureAlphaMod 吗? - user1944441
是的,那似乎解决了问题,所以我只需要想办法平滑地从0渐变到255。感谢@Armin。 - TPS
@Zammaland 现在你已经熟悉了 SDL_SetTextureAlphaMod 和 SDL_Texture,你可以添加一个答案,这样问题就完整了。 - user1944441
1个回答

8

以下是我所发现的。要呈现带有透明度的纹理,您只需要调用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值无法实现平滑的淡入淡出效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接