static — Уменьшение с плавающей запятой с 1.0f до 0.0f (C ++)

Я пытаюсь установить альфа-значение экрана от 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

-2

Решение

Я думаю, что вы хотите следующий цикл:

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,

И вам нужно обновить отображение в цикле, иначе вы увидите только конечное альфа-значение, а не плавное затухание. Вероятно, у вас также должна быть задержка в цикле, чтобы она не проходила так быстро, чтобы пользователь не мог видеть затухание.

0

Другие решения

Код для затухания очень неправильный:

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));
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector