-
Автор темы
- #1
Вы не ждали, а я вернулся, сегодня на повестке дня прекрасный гайдик, самое то для вечера за визуал студией. То, что никто до меня почему-то не делал. Гайд по анимациям в ImGui, самый простейший способ, который между прочим очень эффективен.
Перейдем к практической части, использовать будем std::map и ImGuiID.
Вроде разобрались. Теперь посмотрим как эти две вещи помогут нам на практике.
Создаем функцию, думаю пояснять как это делать не надо. Задаем ей похожие аргументы:
Лейбл будем использовать для ImGuiID, последующие аргументы для размеры нашей кнопки, кстати да, в этом примере мы будем делать кнопку и анимацию по альфе.
Создаем наши переменные, комментарии в коде все пояснят за меня.
Заполним наш контейнер:
Теперь дополняем:
Важно отметить, что элемент нужно рендерить после анимации, если вы например рендерите всякие фигуры через дравлист, то есть сначала анимация, потом рендер, в особенности при нулевой прозрачности.
Что получилось в итоге:
Таким методом можно изменять например размеры, да и вообще что захотите можно сделать плавно. Напомню скептикам, что это самый простой, но в тоже время эффективный способ, всем удачи!
Перейдем к практической части, использовать будем std::map и ImGuiID.
Контейнер map, очень похож на остальные контейнеры, такие как
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.
, но с небольшим отличием. В этот контейнер можно помещать сразу два значения. Если у Вас когда-то была мечта написать свой словарь, то лучше чем map, вам альтернативы не найти.Каждый элемент в имгуи не имеет практической разницы, думаю вы заметили, что если дать любым элементам одинаковый лейбл, то они будут задействоваться одновременно, это все из-за ImGuiID, в дефолтных элементах он привязывается к лейблу элемента. Пример:
C++:
const ImGuiID id = win->GetID(label);
При определенном условии меняем значение переменной, благодаря ImGuiID анимация будет работать только в рамках нашего элемента.
Как выглядит вкратце сама анимация:
Как выглядит вкратце сама анимация:
C++:
static std::map<ImGuiID, float> alpha_anim;
auto it_alpha = alpha_anim.find(id);
if (it_alpha == alpha_anim.end())
{
alpha_anim.insert({ id, 0.f });
it_alpha = alpha_anim.find(id);
}
if (*v)
{
if (it_alpha->second < 1.f)
it_alpha->second += 0.1f;
}
else
{
if (it_alpha->second > 0.f)
it_alpha->second -= 0.1f;
}
Создаем функцию, думаю пояснять как это делать не надо. Задаем ей похожие аргументы:
C++:
void YourFirstAnimation(const char* label, float w, float h)
///
Создаем наши переменные, комментарии в коде все пояснят за меня.
C++:
ImGuiWindow* win = ImGui::GetCurrentWindow(); //указатель на класс окна
const ImGuiID id = win->GetID(label); //получаем id по лейблу
static std::map<ImGuiID, int> alpha_anim; //создаем контейнер map, указываем свой тип переменной
auto it_alpha = alpha_anim.find(id); //создаем переменную типа auto и задаем ей значение итератора find id
C++:
if (it_alpha == alpha_anim.end()) //если массив закончился
{
alpha_anim.insert({ id, 55 }); //заполняем контейнер, 55 - стартовая прозрачность
it_alpha = alpha_anim.find(id); //задаем значение
}
C++:
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, rgb_to_imvec4(55, 55, 55, (int)it_alpha->second)); //меняем цвета кнопки с помощью пушстайла
ImGui::PushStyleColor(ImGuiCol_Button, rgb_to_imvec4(55, 55, 55, (int)it_alpha->second)); //в последнем аргументе указываем нашу it_alpha с указанием на второй параметр нашего контейнера
ImGui::SetCursorPos(ImGui::GetCursorPos()); //задаем позицию по текущей позиции курсора
ImGui::Button(label, ImVec2(w, h)); // рендерим кнопку
ImGui::PopStyleColor(2); //возвращаем дефолтные колорстили
if (ImGui::IsItemHovered()) { //сама анимация при определенном условии, например IsItemHovered
if (it_alpha->second < 255) //макс. прозрачность
it_alpha->second += 8; //8 - скорость появления
}
else { //Точно таже анимация, но плавное исчезновение
if (it_alpha->second > 55) //прозрачность после анимации
it_alpha->second -= 8; //8 - скорость исчезновения
}
Что получилось в итоге:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Не забываем что мы можем использовать любой тип переменных и реализовать это так как захотим, т.е не только альфа для цвета например.Таким методом можно изменять например размеры, да и вообще что захотите можно сделать плавно. Напомню скептикам, что это самый простой, но в тоже время эффективный способ, всем удачи!