ServiceMenu: animació per al missatge de reiniciar

This commit is contained in:
2025-06-15 18:19:09 +02:00
parent dc9a675667
commit ee634cf350
2 changed files with 89 additions and 3 deletions

View File

@@ -67,11 +67,26 @@ void ServiceMenu::render()
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), title_color_.r, title_color_.g, title_color_.b, 255);
SDL_RenderRect(Screen::get()->getRenderer(), &rect_);
// MENSAJE DE RESTART
if (restart_msg_visible_ || restart_msg_animating_)
{
// Al pintar el mensaje, calcula la posición base en ese frame:
float base_y = rect_.y + restart_msg_base_offset_;
float msg_y = base_y + restart_msg_y_;
element_text_->writeDX(
TEXT_COLOR | TEXT_CENTER,
param.game.game_area.center_x,
msg_y,
Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"),
-2,
title_color_);
}
// TITULO
y += title_padding_;
title_text_->writeDX(TEXT_COLOR | TEXT_CENTER, param.game.game_area.center_x, y, title_, -4, title_color_);
if (Options::pending_changes.has_pending_changes)
element_text_->writeDX(TEXT_COLOR | TEXT_CENTER, param.game.game_area.center_x, y + 25, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), -2, title_color_);
// if (Options::pending_changes.has_pending_changes)
// element_text_->writeDX(TEXT_COLOR | TEXT_CENTER, param.game.game_area.center_x, y + 25, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), -2, title_color_);
// LINEA
y = rect_.y + upper_height_;
@@ -114,6 +129,37 @@ void ServiceMenu::update()
updateCounter();
selected_color_ = getSelectedColor();
}
// Detecta cambios en el estado de pending_changes
bool now_pending = Options::pending_changes.has_pending_changes;
if (now_pending != last_pending_changes_)
{
float y_offset = 39.0f; // O el que uses
if (now_pending)
showRestartMessage(y_offset);
else
hideRestartMessage(y_offset);
last_pending_changes_ = now_pending;
}
// Animación del mensaje de reinicio
if (restart_msg_animating_)
{
++restart_msg_anim_step_;
float t = static_cast<float>(restart_msg_anim_step_) / restart_msg_anim_steps_;
// Ease out cubic
t = 1 - pow(1 - t, 3);
restart_msg_y_ = restart_msg_start_y_ + (restart_msg_target_y_ - restart_msg_start_y_) * t;
if (restart_msg_anim_step_ >= restart_msg_anim_steps_)
{
restart_msg_y_ = restart_msg_target_y_;
restart_msg_animating_ = false;
// Si se oculta, asegúrate de que no se pinte más
if (!restart_msg_visible_)
restart_msg_y_ = restart_msg_target_y_;
}
}
}
// Calcula y establece los anclajes y dimensiones del menú
@@ -451,7 +497,8 @@ void ServiceMenu::applySettings(ServiceMenu::SettingsGroup group)
case SettingsGroup::SETTINGS:
{
auto option = getOptionEntryByCaption(Lang::getText("[SERVICE_MENU] SHUTDOWN"));
if (option != nullptr) {
if (option != nullptr)
{
option->hidden = !Options::settings.shutdown_enabled;
}
break;
@@ -622,4 +669,27 @@ std::string ServiceMenu::settingsGroupToString(SettingsGroup group) const
default:
return Lang::getText("[SERVICE_MENU] TITLE");
}
}
// Inicia la animación para mostrar el mensaje de reinicio
void ServiceMenu::showRestartMessage(float y_offset)
{
restart_msg_start_y_ = -8.0f; // Empieza 8 píxeles arriba del destino
restart_msg_target_y_ = 0.0f; // El destino siempre es offset 0 respecto a base_y
restart_msg_y_ = restart_msg_start_y_;
restart_msg_anim_step_ = 0;
restart_msg_animating_ = true;
restart_msg_visible_ = true;
restart_msg_base_offset_ = y_offset; // Nueva variable para recordar el offset
}
// Inicia la animación para ocultar el mensaje de reinicio
void ServiceMenu::hideRestartMessage(float y_offset)
{
restart_msg_start_y_ = restart_msg_y_;
restart_msg_target_y_ = -6.0f; // Sube 8 píxeles arriba del destino
restart_msg_anim_step_ = 0;
restart_msg_animating_ = true;
restart_msg_visible_ = false;
restart_msg_base_offset_ = y_offset;
}