Начинающий
- Статус
- Оффлайн
- Регистрация
- 1 Авг 2024
- Сообщения
- 34
- Реакции
- 0
Данный код демонстрирует создание анимированного интро-экрана для чита, который активируется при его инжекте (внедрении) в игру. Интро длится 3 секунды и включает в себя полупрозрачный фон, динамически анимированный текст "ARCHILIX ALPHA" с градиентным свечением и эффектами затухания, а также круговой индикатор загрузки с процентами, отображающий прогресс. Визуальные элементы отрисовываются с использованием функций ImGui, контролируя время и прозрачность для создания плавных переходов. После завершения интро-экран деактивируется, а для его интеграции необходимо вставить данный фрагмент кода в начале функции рендера игрового меню.
intro:
static bool intro_active = true;
static float intro_start = 0.0f;
const char* full_title = "ARCHILIX ALPHA";
if (intro_active)
{
float time_now = ImGui::GetTime();
if (intro_start == 0.0f)
intro_start = time_now;
float elapsed = time_now - intro_start;
float intro_duration = 3.0f;
float alpha = 1.0f;
if (elapsed < 0.5f)
alpha = elapsed / 0.5f;
else if (elapsed > intro_duration - 0.5f)
alpha = 1.0f - (elapsed - (intro_duration - 0.5f)) / 0.5f;
alpha = std::clamp(alpha, 0.0f, 1.0f);
ImVec2 display_size = ImGui::GetIO().DisplaySize;
ImVec2 center = ImVec2(display_size.x / 2.0f, display_size.y / 2.0f);
ImDrawList* draw = ImGui::GetBackgroundDrawList();
// ==== Полупрозрачный фон ====
ImU32 bgColor = ImColor(10, 10, 10, int(alpha * 100)); // 100/255 — ~40% затемнение
draw->AddRectFilled(ImVec2(0, 0), display_size, bgColor);
// ==== Градиентный Glow текста ====
ImFont* font = FONT::pExtra ? FONT::pExtra : ImGui::GetFont();
float font_size = 48.0f;
ImVec2 text_size = ImGui::CalcTextSize(full_title, nullptr, false, font_size);
ImVec2 text_pos = ImVec2(center.x - text_size.x / 2.0f, center.y - 60.0f);
for (int i = 8; i >= 1; --i) {
float glow_alpha = alpha * 0.04f * i;
ImU32 glow_color = ImColor::HSV(0.55f + 0.05f * sin(time_now + i), 0.6f, 1.0f, glow_alpha);
draw->AddText(font, font_size + i, text_pos, glow_color, full_title);
}
draw->AddText(font, font_size, text_pos, ImColor(255, 255, 255, int(alpha * 255)), full_title);
// ==== Круг загрузки с процентами ====
float progress = std::clamp(elapsed / intro_duration, 0.0f, 1.0f);
float radius = 30.0f;
float thickness = 4.0f;
ImVec2 circle_center = ImVec2(center.x, center.y + 30.0f);
float start_angle = -IM_PI / 2.0f;
float end_angle = start_angle + progress * 2.0f * IM_PI;
// Фон круга
draw->PathClear();
draw->PathArcTo(circle_center, radius, 0, 2 * IM_PI, 64);
draw->PathStroke(ImColor(50, 50, 50, int(alpha * 150)), false, thickness);
// Прогресс-дуга
draw->PathClear();
draw->PathArcTo(circle_center, radius, start_angle, end_angle, 64);
ImU32 ring_color = ImColor::HSV(0.55f + 0.1f * sin(time_now * 2.0f), 0.8f, 1.0f, alpha);
draw->PathStroke(ring_color, false, thickness);
// ==== Текст % внутри круга ====
char percent_text[8];
snprintf(percent_text, sizeof(percent_text), "%d%%", int(progress * 100.0f));
ImVec2 pct_size = ImGui::CalcTextSize(percent_text);
draw->AddText(ImVec2(circle_center.x - pct_size.x / 2, circle_center.y - pct_size.y / 2),
ImColor(220, 220, 220, int(alpha * 255)), percent_text);
// ==== Завершение интро ====
if (elapsed >= intro_duration)
intro_active = false;
return;
}