diff --git a/source/engine.cpp b/source/engine.cpp index 456eba7..1eb4ea0 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -1569,8 +1569,7 @@ void Engine::updateDynamicTheme() { DynamicTheme& theme = dynamic_themes_[current_dynamic_theme_index_]; - // Obtener keyframe actual y destino - const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_]; + // Obtener keyframe destino para calcular duración const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; // Avanzar progreso de transición @@ -1592,11 +1591,9 @@ void Engine::updateDynamicTheme() { } } - // Actualizar colores de pelotas al keyframe actual - for (size_t i = 0; i < balls_.size(); i++) { - size_t color_index = i % current_kf.ball_colors.size(); - balls_[i]->setColor(current_kf.ball_colors[color_index]); - } + // NOTA: No se actualiza Ball::color_ aquí porque getInterpolatedColor() + // calcula el color directamente desde los keyframes cada frame. + // Cuando progress=1.0, getInterpolatedColor() devuelve exactamente el color destino. } } @@ -1659,9 +1656,10 @@ Color Engine::getInterpolatedColor(size_t ball_index) const { const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_]; const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; - Color current_color = balls_[ball_index]->getColor(); - size_t color_index = ball_index % target_kf.ball_colors.size(); - Color target_color = target_kf.ball_colors[color_index]; + // Obtener colores desde keyframes (NO desde Ball::color_) + size_t color_index = ball_index % current_kf.ball_colors.size(); + Color current_color = current_kf.ball_colors[color_index]; // Color del keyframe actual + Color target_color = target_kf.ball_colors[color_index]; // Color del keyframe destino // Interpolar RGB entre keyframes return {