Вопрос Как можно сделать анимацию появления меню?

..................................................
Участник
Статус
Оффлайн
Регистрация
13 Авг 2020
Сообщения
990
Реакции[?]
249
Поинты[?]
25K
Как можно сделать анимацию появления меню?
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Самый простой вариант через прозрачность, для этого нужно:
1. При отрисовке меню прозрачность всех цветов умножать на переменную прозрачности (она будет от 0.0f полностью прозрачное до 1.0f полностью видимое). В imgui есть встроенная такая переменная ImGui::GetStyle()::Alpha которая управляет прозрачностью всего гуя и есть функция которая возвращает цвет помноженый на эту глобальную прозрачность ImGui::GetColorU32().
2. При открытии/закрытии прибавлять/вычитать из этой переменной (разницу между предыдущим и текущем кадром в секундах, в imgui это IO.DeltaTime) * (скорость появления, например при 1.0f меню будет появляться/исчезать ровно за секунду). Такой вариант будет хорошо работать даже если анимация еще не завершена в одну сторону, а пользователь включил обратную.
Небольшой псевдокод, который может помочь понять идею:
C++:
// глобальное состояние
static int anim_dir = 0; // направление анимации: -1 меню исчезает, +1 меню появляется, 0 ничего
static float anim_dur = 1.0f; // длительность цикла анимации в секундах

...

// переключаем ход анимации
if (открыть)
{
    anim_dir = +1;
    // сделать видимым
}
else if (закрыть)
{
    anim_dir = -1;
}

...
    
// обновляем анимацию
const float anim_step = ImGui::GetIO().DeltaTime * (1.0f / anim_dur);
float& anim_alpha = ImGui::GetStyle().Alpha;
if (anim_dir < 0) // исчезает
{
    anim_alpha -= anim_step;
    if (anim_alpha < 0.0f) // полностью
    {
        anim_alpha = 0.0f;
        anim_dir = 0;
        // скрыть вовсе
    }
}
else if (anim_dir > 0) // появляется
{
    anim_alpha += anim_step;
    if (anim_alpha > 1.0f) // полностью
    {
        anim_alpha = 1.0f;
        anim_dir = 0;
    }
}
 
Последнее редактирование:
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,995
Реакции[?]
1,275
Поинты[?]
5K
C++:
 //Создаем переменную типа float и задаем ей стартовое значение
float Alpha = 0.f;
//Способ первый, используя API ImGui
Alpha += ImGui::GetIO().DeltaTime * 0.8f;

//Способ второй, используем основы C++
float Alpha2 = 0.f;
if (Alpha2 < 0.10f)
    Alpha2 += 0.05f;
//У этого способа есть минусы, но с помощью него можно задать точное значение, которое тебе нужно
Надеюсь ума хватит, чтобы свой float засунуть в прозрачность меню.
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,970
Реакции[?]
958
Поинты[?]
19K
Код:
static float alpha = 0;
if (opened && alpha <= 1.f)
    alpha += 0.05;
else if (!opened && alpha >= 0.f)
    alpha -= 0.05;
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha )
//draw window
ImGui::PopStyleVar(1);
 
Сверху Снизу