• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

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

  • Автор темы Автор темы abbc
  • Дата начала Дата начала
..................................................
Участник
Участник
Статус
Оффлайн
Регистрация
13 Авг 2020
Сообщения
1,004
Реакции
252
Как можно сделать анимацию появления меню?
 
Самый простой вариант через прозрачность, для этого нужно:
1. При отрисовке меню прозрачность всех цветов умножать на переменную прозрачности (она будет от 0.0f полностью прозрачное до 1.0f полностью видимое). В imgui есть встроенная такая переменная ImGui::GetStyle()::Alpha которая управляет прозрачностью всего гуя и есть функция которая возвращает цвет помноженый на эту глобальную прозрачность ImGui::GetColorU32().
2. При открытии/закрытии прибавлять/вычитать из этой переменной (разницу между предыдущим и текущем кадром в секундах, в imgui это IO.DeltaTime) * (скорость появления, например при 1.0f меню будет появляться/исчезать ровно за секунду). Такой вариант будет хорошо работать даже если анимация еще не завершена в одну сторону, а пользователь включил обратную.
Небольшой псевдокод, который может помочь понять идею:
C++:
Expand Collapse Copy
// глобальное состояние
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;
    }
}
 
Последнее редактирование:
C++:
Expand Collapse Copy
 //Создаем переменную типа 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 засунуть в прозрачность меню.
 
Последнее редактирование:
Код:
Expand Collapse Copy
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);
 
Назад
Сверху Снизу