diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index 1de9205..dcab168 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -529,9 +529,8 @@ void Scoreboard::renderCarousel(size_t panel_index, int center_x, int y) { // Espacio extra entre letras constexpr int EXTRA_SPACING = 2; - // Carrusel extendido: 9 letras visibles (4 izq + centro + 4 der) - constexpr int VISIBLE_LETTERS = 9; - constexpr int HALF_VISIBLE = VISIBLE_LETTERS / 2; // 4 + // Carrusel extendido: usar constante de clase + constexpr int HALF_VISIBLE = CAROUSEL_VISIBLE_LETTERS / 2; // 4 // Posición flotante actual del carrusel (índice en character_list_) const float carousel_pos = carousel_position_.at(panel_index); @@ -552,9 +551,6 @@ void Scoreboard::renderCarousel(size_t panel_index, int center_x, int y) { // Calcular posición X inicial (centrar el conjunto de 9 letras) int start_x = center_x - (HALF_VISIBLE * CHAR_STEP) - (AVG_CHAR_WIDTH / 2) - pixel_offset; - // Detectar si el carrusel está en movimiento - const bool is_animating = std::abs(carousel_pos - carousel_target_.at(panel_index)) > 0.01f; - // Renderizar las 9 letras visibles for (int i = -HALF_VISIBLE; i <= HALF_VISIBLE; ++i) { // Índice real en character_list_ (con wrap-around circular) @@ -569,27 +565,26 @@ void Scoreboard::renderCarousel(size_t panel_index, int center_x, int y) { // Obtener el carácter directamente de character_list_ std::string single_char(1, char_list[char_index]); - // Calcular distancia flotante al centro visual - const float distance_from_center = std::abs(static_cast(i) + fractional_offset); + // Calcular distancia flotante al centro visual basada en posición real del carácter + float distance_from_center = std::abs(static_cast(char_index) - carousel_pos); - // Calcular color con LERP dinámico + // Manejar wrap-around circular: elegir el camino más corto + if (distance_from_center > static_cast(char_list_size) / 2.0f) { + distance_from_center = static_cast(char_list_size) - distance_from_center; + } + + // Calcular color con LERP dinámico continuo Color letter_color; - if (distance_from_center < 0.5f && !is_animating) { - // Letra central Y carrusel quieto: animated_color_ - letter_color = animated_color_; + if (distance_from_center < 0.5f) { + // Letra cerca del centro: LERP hacia animated_color_ + // distance_from_center va de 0.0 (centro exacto) a 0.5 (borde) + float lerp_to_animated = distance_from_center / 0.5f; // 0.0 a 1.0 + letter_color = animated_color_.LERP(text_color1_, lerp_to_animated); } else { - // Todas las demás letras O carrusel en movimiento: LERP - float base_lerp; - if (distance_from_center < 0.5f) { - // Letra muy cerca del centro durante animación: 0% (color brillante) - base_lerp = 0.0f; - } else { - // Letras alejadas: lerp proporcional a la distancia - base_lerp = (distance_from_center - 0.5f) / (HALF_VISIBLE - 0.5f); - base_lerp = std::min(base_lerp, 1.0f); - } - + // Letras alejadas: LERP hacia color_ (fade out) + float base_lerp = (distance_from_center - 0.5f) / (HALF_VISIBLE - 0.5f); + base_lerp = std::min(base_lerp, 1.0f); const float LERP_FACTOR = base_lerp * 0.85f; letter_color = text_color1_.LERP(color_, LERP_FACTOR); } diff --git a/source/scoreboard.h b/source/scoreboard.h index 73e1798..fca6d7f 100644 --- a/source/scoreboard.h +++ b/source/scoreboard.h @@ -108,6 +108,9 @@ class Scoreboard { Uint64 name_color_last_update_ = 0; // Último tick de actualización del color del nombre float power_ = 0; // Poder actual de la fase + // --- Constantes --- + static constexpr int CAROUSEL_VISIBLE_LETTERS = 9; + // --- Variables de aspecto --- Color text_color1_, text_color2_; // Colores para los marcadores del texto;