From d851cdd2feedc4f4ab3b9b143201fe64117cb308 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 1 Oct 2025 20:06:08 +0200 Subject: [PATCH] scoreboard.cpp: afegit un setMode() com deu mana --- source/scoreboard.cpp | 62 ++++++++++++++++++++++++++++++++----------- source/scoreboard.h | 2 +- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index fcc5efd..a023da3 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -142,6 +142,40 @@ void Scoreboard::setCarouselAnimation(Id id, int selected_index, EnterName* ente } } +// Establece el modo del panel y gestiona transiciones +void Scoreboard::setMode(Id id, Mode mode) { + size_t idx = static_cast(id); + + // Cambiar el modo + panel_.at(idx).mode = mode; + + // Gestionar inicialización/transiciones según el nuevo modo + switch (mode) { + case Mode::ENTER_NAME: + // Resetear carrusel al entrar en modo de entrada de nombre + // Esto fuerza una reinicialización en la próxima llamada a setCarouselAnimation() + if (carousel_prev_index_.at(idx) != -1) { + carousel_prev_index_.at(idx) = -1; + } + text_slide_offset_.at(idx) = 0.0f; + break; + + case Mode::ENTER_TO_SHOW_NAME: + // Iniciar animación de transición + text_slide_offset_.at(idx) = 0.0f; + break; + + case Mode::SHOW_NAME: + // Asegurar que la animación está completa + text_slide_offset_.at(idx) = 1.0f; + break; + + // Otros modos no requieren inicialización especial + default: + break; + } +} + // Transforma un valor numérico en una cadena de 7 cifras auto Scoreboard::updateScoreText(int num) -> std::string { std::ostringstream oss; @@ -212,12 +246,8 @@ void Scoreboard::updateTextSlideAnimation(float deltaTime) { // Terminar animación y cambiar a SHOW_NAME cuando se complete if (text_slide_offset_.at(i) >= 1.0f) { - text_slide_offset_.at(i) = 1.0f; - panel_.at(i).mode = Mode::SHOW_NAME; + setMode(static_cast(i), Mode::SHOW_NAME); } - } else if (current_mode != Mode::ENTER_NAME) { - // Resetear offset si no estamos en ENTER_NAME ni en transición - text_slide_offset_.at(i) = 0.0f; } } } @@ -413,33 +443,35 @@ void Scoreboard::renderEnterNameMode(size_t panel_index) { void Scoreboard::renderEnterToShowNameMode(size_t panel_index) { // Calcular progreso suavizado de la animación (0.0 a 1.0) - float progress = text_slide_offset_.at(panel_index); - progress = std::min(progress, 1.0f); // Clampear a 1.0 - const float t = static_cast(easeOutCubic(progress)); - const float ROW_SIZE = rect_.h / 4.0f; - const float y_offset = t * ROW_SIZE; // Desplazamiento en píxeles + const float t = static_cast(easeOutCubic(text_slide_offset_.at(panel_index))); + + // Calcular desplazamientos reales entre slots (no son exactamente ROW_SIZE) + const float delta_1_to_2 = slot4_2_.y - slot4_1_.y; // Diferencia real entre ROW1 y ROW2 + const float delta_2_to_3 = slot4_3_.y - slot4_2_.y; // Diferencia real entre ROW2 y ROW3 + const float delta_3_to_4 = slot4_4_.y - slot4_3_.y; // Diferencia real entre ROW3 y ROW4 // ========== Texto que ENTRA desde arriba ========== // name_ (entra desde arriba hacia ROW1) - text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + y_offset - ROW_SIZE, + // Debe venir desde donde estaría ROW0, que está a delta_1_to_2 píxeles arriba de ROW1 + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + t * delta_1_to_2 - delta_1_to_2, name_.at(panel_index), 1, text_color1_); // ========== Textos que SE MUEVEN (renderizar UNA sola vez) ========== // SCORE (se mueve de ROW1 a ROW2) - text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + y_offset, + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + t * delta_1_to_2, updateScoreText(score_.at(panel_index)), 1, text_color2_); // "ENTER NAME" (se mueve de ROW2 a ROW3) - text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y + y_offset, + text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y + t * delta_2_to_3, Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); // enter_name_ (se mueve de ROW3 a ROW4) - text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y + y_offset, + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y + t * delta_3_to_4, enter_name_.at(panel_index), 1, text_color2_); // ========== Elemento que SALE hacia abajo ========== // CARRUSEL (sale desde ROW4 hacia abajo, fuera de pantalla) - renderCarousel(panel_index, slot4_4_.x, static_cast(slot4_4_.y + y_offset)); + renderCarousel(panel_index, slot4_4_.x, static_cast(slot4_4_.y + t * delta_3_to_4)); } void Scoreboard::renderShowNameMode(size_t panel_index) { diff --git a/source/scoreboard.h b/source/scoreboard.h index c29f802..1c7840b 100644 --- a/source/scoreboard.h +++ b/source/scoreboard.h @@ -63,7 +63,7 @@ class Scoreboard { void setContinue(Id id, int continue_counter) { continue_counter_.at(static_cast(id)) = continue_counter; } void setHiScore(int hi_score) { hi_score_ = hi_score; } void setHiScoreName(const std::string& name) { hi_score_name_ = name; } - void setMode(Id id, Mode mode) { panel_.at(static_cast(id)).mode = mode; } + void setMode(Id id, Mode mode); // Establece el modo del panel y gestiona transiciones void setMult(Id id, float mult) { mult_.at(static_cast(id)) = mult; } void setName(Id id, const std::string& name) { name_.at(static_cast(id)) = name; } void setPower(float power) { power_ = power; }