diff --git a/source/player.cpp b/source/player.cpp index 74972ea..b749ad2 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -611,7 +611,7 @@ void Player::setPlayingState(State state) { break; } case State::ENTERING_NAME: { - setScoreboardMode(Scoreboard::Mode::ENTER_NAME); + setScoreboardMode(Scoreboard::Mode::SCORE_TO_ENTER_NAME); // Iniciar animación de transición break; } case State::SHOWING_NAME: { @@ -666,7 +666,7 @@ void Player::setPlayingState(State state) { case State::ENTERING_NAME_GAME_COMPLETED: { // setWalkingState(State::WALKING_STOP); // setFiringState(State::FIRING_NONE); - setScoreboardMode(Scoreboard::Mode::ENTER_NAME); + setScoreboardMode(Scoreboard::Mode::SCORE_TO_ENTER_NAME); // Iniciar animación de transición break; } case State::LEAVING_SCREEN: { diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index ead63b1..7143470 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -151,6 +151,15 @@ void Scoreboard::setMode(Id id, Mode mode) { // Gestionar inicialización/transiciones según el nuevo modo switch (mode) { + case Mode::SCORE_TO_ENTER_NAME: + // Iniciar animación de transición SCORE → ENTER_NAME + text_slide_offset_.at(idx) = 0.0f; + // Resetear carrusel para que se inicialice correctamente en ENTER_NAME + if (carousel_prev_index_.at(idx) != -1) { + carousel_prev_index_.at(idx) = -1; + } + break; + 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() @@ -161,7 +170,7 @@ void Scoreboard::setMode(Id id, Mode mode) { break; case Mode::ENTER_TO_SHOW_NAME: - // Iniciar animación de transición + // Iniciar animación de transición ENTER_NAME → SHOW_NAME text_slide_offset_.at(idx) = 0.0f; break; @@ -235,13 +244,21 @@ void Scoreboard::updateCarouselAnimation(float deltaTime) { } } -// Actualiza la animación de deslizamiento de texto (transición ENTER_NAME -> SHOW_NAME) +// Actualiza las animaciones de deslizamiento de texto void Scoreboard::updateTextSlideAnimation(float deltaTime) { for (size_t i = 0; i < static_cast(Id::SIZE); ++i) { Mode current_mode = panel_.at(i).mode; - if (current_mode == Mode::ENTER_TO_SHOW_NAME) { - // Incrementar progreso de animación (0.0 a 1.0) + if (current_mode == Mode::SCORE_TO_ENTER_NAME) { + // Incrementar progreso de animación SCORE → ENTER_NAME (0.0 a 1.0) + text_slide_offset_.at(i) += deltaTime / TEXT_SLIDE_DURATION; + + // Terminar animación y cambiar a ENTER_NAME cuando se complete + if (text_slide_offset_.at(i) >= 1.0f) { + setMode(static_cast(i), Mode::ENTER_NAME); + } + } else if (current_mode == Mode::ENTER_TO_SHOW_NAME) { + // Incrementar progreso de animación ENTER_NAME → SHOW_NAME (0.0 a 1.0) text_slide_offset_.at(i) += deltaTime / TEXT_SLIDE_DURATION; // Terminar animación y cambiar a SHOW_NAME cuando se complete @@ -330,6 +347,9 @@ void Scoreboard::renderPanelContent(size_t panel_index) { case Mode::CONTINUE: renderContinueMode(panel_index); break; + case Mode::SCORE_TO_ENTER_NAME: + renderScoreToEnterNameMode(panel_index); + break; case Mode::ENTER_NAME: renderEnterNameMode(panel_index); break; @@ -416,6 +436,38 @@ void Scoreboard::renderContinueMode(size_t panel_index) { text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, std::to_string(continue_counter_.at(panel_index)), 1, text_color2_); } +void Scoreboard::renderScoreToEnterNameMode(size_t panel_index) { + // Calcular progreso suavizado de la animación (0.0 a 1.0) + const float t = static_cast(easeInOutSine(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 SALE hacia arriba ========== + // name_ (sale desde ROW1 hacia arriba) + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y - t * delta_1_to_2, + name_.at(panel_index), 1, text_color1_); + + // ========== Textos que SE MUEVEN hacia arriba ========== + // score_ (se mueve de ROW2 a ROW1) + text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y - t * delta_1_to_2, + updateScoreText(score_.at(panel_index)), 1, text_color2_); + + // "ENTER NAME" (se mueve de ROW3 a ROW2) + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - t * delta_2_to_3, + Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); + + // enter_name_ (se mueve de ROW4 a ROW3) + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - t * delta_3_to_4, + enter_name_.at(panel_index), 1, text_color2_); + + // ========== Elemento que ENTRA desde abajo ========== + // CARRUSEL (entra desde debajo de ROW4 hacia ROW4) + renderCarousel(panel_index, slot4_4_.x, static_cast(slot4_4_.y + delta_3_to_4 - t * delta_3_to_4)); +} + void Scoreboard::renderEnterNameMode(size_t panel_index) { /* // SCORE diff --git a/source/scoreboard.h b/source/scoreboard.h index 1c7840b..781b36b 100644 --- a/source/scoreboard.h +++ b/source/scoreboard.h @@ -35,8 +35,9 @@ class Scoreboard { WAITING, GAME_OVER, DEMO, + SCORE_TO_ENTER_NAME, // Transición animada: SCORE → ENTER_NAME ENTER_NAME, - ENTER_TO_SHOW_NAME, // Estado de transición con animación + ENTER_TO_SHOW_NAME, // Transición animada: ENTER_NAME → SHOW_NAME SHOW_NAME, GAME_COMPLETED, NUM_MODES, @@ -140,9 +141,10 @@ class Scoreboard { void renderGameOverMode(); void renderStageInfoMode(); void renderContinueMode(size_t panel_index); + void renderScoreToEnterNameMode(size_t panel_index); // Renderiza la transición SCORE → ENTER_NAME void renderEnterNameMode(size_t panel_index); void renderNameInputField(size_t panel_index); - void renderEnterToShowNameMode(size_t panel_index); // Renderiza la transición animada + void renderEnterToShowNameMode(size_t panel_index); // Renderiza la transición ENTER_NAME → SHOW_NAME void renderShowNameMode(size_t panel_index); void renderGameCompletedMode(size_t panel_index); void renderCarousel(size_t panel_index, int center_x, int y); // Pinta el carrusel de caracteres con colores LERP