Visualment, el carrusel ja salta al ultim caracter (instantani)

Si no hi ha lletres per a borrar, no fa roidet
This commit is contained in:
2025-10-22 18:47:42 +02:00
parent b933ceee63
commit 88d814f371
3 changed files with 36 additions and 37 deletions

View File

@@ -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<size_t>(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<float>(selected_index);
carousel_target_.at(idx) = static_cast<float>(selected_index);
carousel_position_.at(idx) = static_cast<float>(selected_index);
carousel_target_.at(idx) = static_cast<float>(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<int>(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<float>(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<float>(selected_index);
carousel_target_.at(idx) = static_cast<float>(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<float>(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<size_t>(id);