finalitzada la implementació del carrusel

This commit is contained in:
2025-10-01 18:49:11 +02:00
parent b4f2251508
commit 6ad34eaf57
2 changed files with 21 additions and 23 deletions

View File

@@ -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<float>(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<float>(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<float>(char_list_size) / 2.0f) {
distance_from_center = static_cast<float>(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);
}

View File

@@ -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;