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