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

Начинающий
Статус
Оффлайн
Регистрация
5 Янв 2024
Сообщения
9
Реакции[?]
1
Поинты[?]
2K
Недавно увидел анимацию пандоры кряк при инжекте (Появляется затемнение экрана и по середине лого в цвет меню который ты задал).

Есть вариант сделать это как-то без костылей? Если есть, то подскажите пожалуйста, буду благодарен)
 
Начинающий
Статус
Оффлайн
Регистрация
23 Апр 2024
Сообщения
99
Реакции[?]
7
Поинты[?]
2K
смари до инизилизации самой менюшки имгуи ты обязан просто через цикл с затемнением показать картинку а потом через тот же цикл скрыть, и запустить main imgui. чатгпт в помощь
 
Начинающий
Статус
Оффлайн
Регистрация
5 Янв 2024
Сообщения
9
Реакции[?]
1
Поинты[?]
2K
смари до инизилизации самой менюшки имгуи ты обязан просто через цикл с затемнением показать картинку а потом через тот же цикл скрыть, и запустить main imgui. чатгпт в помощь
Сепес, мне чат гпт не пригодится, ты в целом хорошо объяснил
 
Начинающий
Статус
Оффлайн
Регистрация
10 Сен 2024
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Рендер окна загрузки:
Код:
void RenderLoadingScreen()
{
    ImGui::SetNextWindowPos(ImVec2(-100, 0), ImGuiCond_Always);
    //ImVec2 newSize = ImVec2(ImGui::GetIO().DisplaySize.x - 100, ImGui::GetIO().DisplaySize.y + 100);
    ImVec2 newSize = ImVec2(3000, 3000);
    ImGui::SetNextWindowSize(newSize, ImGuiCond_Always);

    ImGui::Begin("Loading Screen", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoBackground);

    // Получаем доступ к ImDrawList
    ImDrawList* draw_list = ImGui::GetWindowDrawList();

    // Размер экрана
    ImVec2 screen_size = ImGui::GetIO().DisplaySize;

    // Рисуем полупрозрачный чёрный фон на весь экран
    ImU32 bg_color = IM_COL32(0, 0, 0, 128);  // Полупрозрачный чёрный
    float offsetX = 100.0f; // Отступ по оси X
    float offsetY = 100.0f; // Отступ по оси Y

    // Создаем прямоугольник с отступами
    draw_list->AddRectFilled(ImVec2(0, 0), ImVec2(screen_size.x + offsetX, screen_size.y + offsetY), bg_color);

    // Центрируем текст "Loading..." по экрану
    ImVec2 text_size = ImGui::CalcTextSize("Loading...");
    ImVec2 text_pos = ImVec2((screen_size.x - text_size.x) / 2, (screen_size.y - text_size.y) / 2);

    // Рисуем текст "Loading..." белым цветом
    draw_list->AddText(text_pos, IM_COL32(255, 255, 255, 220), "Loading...");

    // Параметры анимации
    static float time = 0.0f;
    time += 0.05f; // Скорость вращения (регулируйте по вашему желанию)

    // Радиус и толщина круга
    float radius = 30.0f;
    float thickness = 4.0f;

    // Количество сегментов (больше сегментов - плавнее вращение)
    const int num_segments = 30;
    const float angle_step = 2.0f * 3.14159265359f / num_segments;

    // Центр анимации (незначительно выше текста)
    ImVec2 center = ImVec2(screen_size.x / 2, screen_size.y / 2 - text_size.y / 2 - 40); // Центрируем анимацию выше текста

    // Рисуем частичный круг (3/4 круга)
    const float start_angle = 0.0f;  // Начальный угол (с чего начать рисовать)
    const float end_angle = 3.0f * 3.14159265359f / 2.0f;  // Конечный угол (три четверти круга)

    // Рисуем вращающийся сегмент (сдвигаем углы на время)
    for (float angle = start_angle; angle < end_angle; angle += angle_step) {
        float next_angle = angle + angle_step;
        float current_angle = angle + time; // Добавляем time для вращения

        ImVec2 start(center.x + radius * cos(current_angle), center.y + radius * sin(current_angle));
        ImVec2 end(center.x + radius * cos(current_angle + angle_step), center.y + radius * sin(current_angle + angle_step));

        // Рисуем сегмент
        draw_list->AddLine(start, end, IM_COL32(255, 255, 255, 220), thickness);
    }

    ImGui::End();
}
Открытие окна меню:

Код:
long __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
    if (!init)
    {
        InitImGui(pDevice);
        init = true;
    }

    ImGui_ImplDX9_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::StyleColorsDark();
    ImGui::NewFrame();
    ImGui::SetNextWindowSize(ImVec2(700, 500)); // Устанавливаем размер окна 400x300
    auto currentTime = std::chrono::steady_clock::now();
    auto elapsedSeconds = std::chrono::duration_cast<std::chrono::seconds>(currentTime - startTime).count();
    if (elapsedSeconds < loadingTime)
    {
        // Показываем экран загрузки, если время загрузки не истекло
        RenderLoadingScreen();
    }
    else
    {
        // Если время загрузки истекло, скрываем экран загрузки и отображаем меню
        showLoadingScreen = false;
    }
    // Отображаем основное меню, если экран загрузки завершён
    if (GetAsyncKeyState(VK_INSERT) & 1)
    {
        menu = !menu;
    }
 
Сверху Снизу