diff --git a/source/enter_name.hpp b/source/enter_name.hpp index 438f9e4..abb6c8b 100644 --- a/source/enter_name.hpp +++ b/source/enter_name.hpp @@ -27,6 +27,7 @@ class EnterName { [[nodiscard]] auto getSelectedIndex() const -> int { return selected_index_; } // Obtiene el índice del carácter seleccionado [[nodiscard]] auto getCharacterList() const -> const std::string& { return character_list_; } // Obtiene la lista completa de caracteres [[nodiscard]] auto nameIsFull() const -> bool { return name_.size() == MAX_NAME_SIZE; } // Informa de si el nombre ha alcanzado su limite + [[nodiscard]] auto nameIsEmpty() const -> bool { return name_.empty(); } // Informa de si el nombre está vacío [[nodiscard]] auto endCharSelected() const -> bool { return selected_index_ == character_list_.size() - 1; } // Informa de si está seleccionado el caracter de terminar private: diff --git a/source/player.cpp b/source/player.cpp index bc3e28f..1c97c9a 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -125,7 +125,7 @@ void Player::setInputPlaying(Input::Action action) { // Procesa inputs para cuando está introduciendo el nombre void Player::setInputEnteringName(Input::Action action) { switch (action) { - case Input::Action::FIRE_LEFT: + case Input::Action::FIRE_LEFT: // Añade una letra if (isShowingName()) { passShowingName(); } else { @@ -139,12 +139,14 @@ void Player::setInputEnteringName(Input::Action action) { } } break; - case Input::Action::FIRE_CENTER: + case Input::Action::FIRE_CENTER: // Borra una letra if (isShowingName()) { passShowingName(); } else { - enter_name_->removeLastCharacter(); - playSound("service_menu_back.wav"); + if (!enter_name_->nameIsEmpty()) { + enter_name_->removeLastCharacter(); + playSound("service_menu_back.wav"); + } } break; case Input::Action::RIGHT: diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index a2b367c..a23af47 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -95,67 +95,63 @@ Scoreboard::~Scoreboard() { } } -// Configura la animación del carrusel // Configura la animación del carrusel void Scoreboard::setCarouselAnimation(Id id, int selected_index, EnterName* enter_name_ptr) { auto idx = static_cast(id); - // Guardar referencia a EnterName + // Guardar referencia al objeto EnterName enter_name_ref_.at(idx) = enter_name_ptr; if ((enter_name_ptr == nullptr) || selected_index < 0) { return; } - // Primera inicialización: posicionar directamente sin animar + // ===== Primera inicialización ===== if (carousel_prev_index_.at(idx) == -1) { - carousel_position_.at(idx) = static_cast(selected_index); - carousel_target_.at(idx) = static_cast(selected_index); + carousel_position_.at(idx) = static_cast(selected_index); + carousel_target_.at(idx) = static_cast(selected_index); carousel_prev_index_.at(idx) = selected_index; return; } int prev_index = carousel_prev_index_.at(idx); - - // Si el índice seleccionado no cambia, no hay nada que hacer if (selected_index == prev_index) { + return; // No hay cambio + } + + // ===== Bloqueo: si aún está animando, ignorar nueva orden ===== + if (std::abs(carousel_position_.at(idx) - carousel_target_.at(idx)) > 0.01f) { return; } - // 🚫 BLOQUEO: si todavía hay una animación en curso, ignoramos el nuevo movimiento - if (std::abs(carousel_position_.at(idx) - carousel_target_.at(idx)) > 0.01f) { - return; // Aún animando: no aceptar nuevo target hasta terminar - } - - // ---- Animación completada → procesar el nuevo movimiento ---- - int direction = selected_index - prev_index; - - // Obtener tamaño de la lista para manejar wrap-around + // ===== Calcular el salto ===== + int delta = selected_index - prev_index; const int LIST_SIZE = static_cast(enter_name_ptr->getCharacterList().size()); - // Manejar wrap-around circular - if (direction > LIST_SIZE / 2) { - direction = -(LIST_SIZE - direction); // Wrap backward (ej: Z → A) - } else if (direction < -LIST_SIZE / 2) { - direction = LIST_SIZE + direction; // Wrap forward (ej: A → Z) + // Ajustar para wrap-around circular (camino más corto) + if (delta > LIST_SIZE / 2) { + delta -= LIST_SIZE; + } else if (delta < -LIST_SIZE / 2) { + delta += LIST_SIZE; } - // Normalizar dirección a -1 o +1 - direction = (direction > 0) ? 1 : ((direction < 0) ? -1 : 0); - - if (direction != 0) { - // Asegurar que partimos de una posición alineada - carousel_position_.at(idx) = std::round(carousel_position_.at(idx)); - - // Actualizar el nuevo target relativo - carousel_target_.at(idx) = carousel_position_.at(idx) + static_cast(direction); - - // Guardar el nuevo índice seleccionado - carousel_prev_index_.at(idx) = selected_index; + // ===== Diferenciar salto corto o largo ===== + if (std::abs(delta) > 2) { + // Salto grande → ir directo sin animación + carousel_position_.at(idx) = static_cast(selected_index); + carousel_target_.at(idx) = static_cast(selected_index); + } else { + // Salto corto → animación suave normal + carousel_position_.at(idx) = std::round(carousel_position_.at(idx)); + carousel_target_.at(idx) = carousel_position_.at(idx) + static_cast(delta); } + + // Actualizar índice actual + carousel_prev_index_.at(idx) = selected_index; } + // Establece el modo del panel y gestiona transiciones void Scoreboard::setMode(Id id, Mode mode) { auto idx = static_cast(id);