递减浮动从1.0f到0.0f(C ++)

时间:2016-04-04 20:16:30

标签: c++ static alpha decrement

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

static float cur_alpha;

这样做的功能名为HUD_FadeAlpha。还有一个HUD_SetAlpha,但它只包含{cur_alpha = alpha;},其中FadeAlpha尝试设置alpha并将float递减为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();
    }

}

但由于某种原因,它不起作用,它的表现就像没有任何减少的东西,所以它只是将文本绘制到屏幕并消失而没有阿尔法淡化效果。 。 。 (?)

我尝试做的是将消息从1.0f开始,然后淡出为0.0f,因为HUD_Alpha将其设置为实体,并且在消息被绘制到屏幕后需要淡化为空。由于某种原因,它无法正常工作,所以也许我没有正确设置它。不确定是否需要在HUD_FadeAlpha或Message_Drawer中完成。

所以基本上,从1.0f - &gt; 0.75f,0.5f,0.25f,0.0f,但使用3位小数快速平滑地递减。该消息仅被吸引到屏幕上大约4秒钟并消失(4 * TICRATE,35tics = 1s),所以它需要很快,但不能太快以至于它不会被吸引到屏幕上第一名。

非常感谢你们! &LT; 3

2 个答案:

答案 0 :(得分: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));

答案 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值,而不是平滑的淡入淡出。你可能也应该在循环中有一个延迟,所以它不会那么快,以至于用户看不到淡入淡出。