将浮点数从 1.0f 递减到 0.0f (C++)

Decrement float from 1.0f to 0.0f (C++)

我正在尝试将屏幕 alpha 量设置为 1.0f 到 0.0f(完全淡出)。我有以下定义:

static float cur_alpha;

执行此操作的函数名为 HUD_FadeAlpha。还有一个 HUD_SetAlpha,但它只包含 {cur_alpha = alpha;},其中 FadeAlpha 尝试设置 alpha 并将浮点数递减为 0.0f:

void HUD_FadeAlpha(float alpha)
{
    cur_alpha = alpha;
    int i;

    for (int i = 0; i < 100; i-- )
    {
      alpha = 1.000f + i/1.000f;
    }

}

这应该将 alpha 值从 1.0f 减少到 0.0f(透明)。它只能与此一起使用:

void Message_Drawer(void)
{
    CON_ShowFPS();

    if (message_on)
    {
        HUD_SetAlpha(1.000f); // sets the alpha
        HUD_SetAlignment(0, 0);
        HUD_DrawText(160- 3 / 2, 3, w_message.c_str());
        HUD_FadeAlpha();//******** the function to fade out. ********
        HUD_SetScale();
        HUD_SetAlignment();
        HUD_SetAlpha();
        HUD_FadeAlpha();
    }

}

但由于某种原因,它不起作用,它的行为就像没有任何东西可以递减,所以它只是将文本绘制到屏幕上并消失,没有 alpha 淡化效果。 . . (?)

我想要做的是让消息从 1.0f 开始,淡出到 0.0f,因为 HUD_Alpha 将它设置为纯色,并且需要在消息结束后淡出到无绘制到屏幕上。出于某种原因,它无法正常工作,所以也许我没有正确设置它。不确定是否需要在 HUD_FadeAlpha 或 Message_Drawer.

中完成

所以基本上,从 1.0f -> 0.75f,0.5f,0.25f,0.0f,但是递减的很快很平滑,使用 3 位小数。该消息只在屏幕上显示大约 4 秒然后消失 (4*TICRATE, 35tics=1s),因此它需要快,但不能太快以至于它一开始就不会被显示到屏幕上.

非常感谢大家!! <3

淡出的代码非常错误:

for (int i = 0; i < 100; i-- )
{
    alpha = 1.000f + i/1.000f;
}

首先,您从 0 开始递减,这意味着您只会获得 i = 0.

的值

其次(假设您解决了该问题),在每次迭代中,您将获得如下所示的 alpha 值:

1.000f
2.000f
3.000f
4.000f
5.000f
6.000f
/*...*/

最后,使用循环甚至没有多大意义:您需要根据时间值进行插值,因此它应该计算给定时间点的 alpha 值。

float calculate_alpha(float now, float start_time, float end_time, float start_alpha, float end_alpha) {
    if(now <= start_time) return start_alpha;
    if(now >= end_time) return end_alpha;
    float time_percentage = (now - start_time) / (end_time - start_time);
    return (end_alpha - start_alpha) * time_percentage + start_alpha;
}

然后可以在您的主机代码中调用它,如下所示:

HUD_setAlpha(calculate_alpha(now, /*time that the fade starts*/, /*time that the fade ends*/, 1, 0));

我想你想要的是下面的循环:

for (int i = 100; i >= 0; i--) {
    alpha = i/100.0f;
    // code here to update the displayed alpha
}

除以 1.000f 只是除以 1,除了从 int 转换为 float 外,它不会做任何事情。除以 100.0f 将正确生成每次递减的分数 -- 起始值为 100/100.0f = 1.0f,结束值为 0/100.0f = 0.0f.

并且您需要在循环内更新显示,否则您将只能看到最终的 alpha 值,而不是平滑的淡入淡出。您可能还应该在循环中有一个延迟,这样它就不会太快以至于用户看不到淡入淡出。