Я пытаюсь установить альфа-значение экрана от 1.0f до 0.0f (полное исчезновение). Я определил следующее:
static float cur_alpha;
И функция для этого называется HUD_FadeAlpha. Существует также HUD_SetAlpha, но он содержит только {cur_alpha = alpha;}, где FadeAlpha пытается установить альфа и уменьшить число с плавающей точкой до 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;
}
}
Это должно уменьшить альфа-значение с 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 -> 0.75f, 0.5f, 0.25f, 0.0f, но быстро и плавно уменьшаются, используя 3 знака после запятой. Сообщение выводится на экран только в течение примерно 4 секунд и исчезает (4 * TICRATE, 35tics = 1s), поэтому оно должно быть быстрым, но не слишком быстрым, чтобы оно не отображалось на экране. ,
Большое спасибо всем вам!! <3
Я думаю, что вы хотите следующий цикл:
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
,
И вам нужно обновить отображение в цикле, иначе вы увидите только конечное альфа-значение, а не плавное затухание. Вероятно, у вас также должна быть задержка в цикле, чтобы она не проходила так быстро, чтобы пользователь не мог видеть затухание.
Код для затухания очень неправильный:
for (int i = 0; i < 100; i-- )
{
alpha = 1.000f + i/1.000f;
}
Начнем с того, что вы начинаете с 0 и уменьшаете, что означает, что вы получите только значения i = 0
,
Во-вторых (если вы решите эту проблему), на каждой итерации вы будете получать альфа-значения, которые выглядят так:
1.000f
2.000f
3.000f
4.000f
5.000f
6.000f
/*...*/
И, наконец, использование цикла даже не имеет особого смысла: вам нужно интерполировать на основе значений времени, поэтому он должен вычислять альфа-значение в данный момент времени.
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));