diff --git a/source/background.cpp b/source/background.cpp index 3253d55..bffbf74 100644 --- a/source/background.cpp +++ b/source/background.cpp @@ -143,7 +143,7 @@ void Background::update(float delta_time) { } // Actualiza el valor de alpha - updateAlphaColorTexture(); + updateAlphaColorTexture(delta_time); // Actualiza las nubes updateClouds(delta_time); @@ -488,13 +488,39 @@ void Background::setAlpha(int alpha) { alpha_color_texture_ = alpha; } -// Actualiza el valor de alpha -void Background::updateAlphaColorTexture() { +// Actualiza el valor de alpha (time-based) +void Background::updateAlphaColorTexture(float delta_time) { + // 1. Si ya hemos llegado al destino, no hacemos nada. if (alpha_color_texture_ == previous_alpha_color_texture_) { return; } - alpha_color_texture_ > previous_alpha_color_texture_ ? ++previous_alpha_color_texture_ : --previous_alpha_color_texture_; - SDL_SetTextureAlphaMod(color_texture_, previous_alpha_color_texture_); + + // 2. Define la velocidad del cambio (p. ej., 150 unidades de alfa por segundo). + // Puedes ajustar este valor para que la transición sea más rápida o lenta. + constexpr float ALPHA_TRANSITION_SPEED = 150.0F; + + // 3. Determina la dirección del cambio (subir o bajar el alfa) + if (alpha_color_texture_ > previous_alpha_color_texture_) { + // Aumentar el alfa + current_alpha_float_ += ALPHA_TRANSITION_SPEED * delta_time; + // Nos aseguramos de no pasarnos del objetivo + current_alpha_float_ = std::min(current_alpha_float_, static_cast(alpha_color_texture_)); + } else { + // Disminuir el alfa + current_alpha_float_ -= ALPHA_TRANSITION_SPEED * delta_time; + // Nos aseguramos de no quedarnos cortos del objetivo + current_alpha_float_ = std::max(current_alpha_float_, static_cast(alpha_color_texture_)); + } + + // 4. Actualiza el valor entero solo si ha cambiado lo suficiente + // Usamos std::round para un redondeo más natural. + const auto new_alpha = static_cast(std::round(current_alpha_float_)); + + if (new_alpha != previous_alpha_color_texture_) { + previous_alpha_color_texture_ = new_alpha; + // SDL espera un Uint8 (0-255), así que hacemos un cast seguro. + SDL_SetTextureAlphaMod(color_texture_, static_cast(previous_alpha_color_texture_)); + } } // Precalcula el vector con el recorrido del sol diff --git a/source/background.hpp b/source/background.hpp index 118e751..afb4f00 100644 --- a/source/background.hpp +++ b/source/background.hpp @@ -107,6 +107,7 @@ class Background { float progress_ = 0.0F; // Progresión interna float clouds_speed_ = 0; // Velocidad de las nubes float transition_ = 0; // Porcentaje de transición + float current_alpha_float_ = 0.0F; // Acumulador para el valor alfa preciso size_t gradient_number_ = 0; // Índice de fondo degradado size_t alpha_color_texture_ = 0; // Transparencia de atenuación size_t previous_alpha_color_texture_ = 0; // Transparencia anterior @@ -121,19 +122,19 @@ class Background { float completion_initial_progress_ = 0.0F; // Progreso inicial al entrar en estado completado // --- Métodos internos --- - void initializePaths(); // Inicializa las rutas del sol y la luna - void initializeRects(); // Inicializa los rectángulos de gradientes y nubes - void initializeSprites(); // Crea los sprites - void initializeSpriteProperties(); // Configura las propiedades iniciales de los sprites - void initializeTextures(); // Inicializa las texturas de renderizado - void updateProgression(float delta_time); // Actualiza la progresión y calcula transiciones - void updateCloudsSpeed(); // Actualiza la velocidad de las nubes según el estado - void renderGradient(); // Dibuja el gradiente de fondo - void renderTopClouds(); // Dibuja las nubes superiores - void renderBottomClouds(); // Dibuja las nubes inferiores - void fillCanvas(); // Compone todos los elementos en la textura - void updateAlphaColorTexture(); // Actualiza el alpha de la textura de atenuación - void updateClouds(float delta_time); // Actualiza el movimiento de las nubes (time-based) - void createSunPath(); // Precalcula el recorrido del sol - void createMoonPath(); // Precalcula el recorrido de la luna + void initializePaths(); // Inicializa las rutas del sol y la luna + void initializeRects(); // Inicializa los rectángulos de gradientes y nubes + void initializeSprites(); // Crea los sprites + void initializeSpriteProperties(); // Configura las propiedades iniciales de los sprites + void initializeTextures(); // Inicializa las texturas de renderizado + void updateProgression(float delta_time); // Actualiza la progresión y calcula transiciones + void updateCloudsSpeed(); // Actualiza la velocidad de las nubes según el estado + void renderGradient(); // Dibuja el gradiente de fondo + void renderTopClouds(); // Dibuja las nubes superiores + void renderBottomClouds(); // Dibuja las nubes inferiores + void fillCanvas(); // Compone todos los elementos en la textura + void updateAlphaColorTexture(float delta_time); // Actualiza el alpha de la textura de atenuación + void updateClouds(float delta_time); // Actualiza el movimiento de las nubes (time-based) + void createSunPath(); // Precalcula el recorrido del sol + void createMoonPath(); // Precalcula el recorrido de la luna }; \ No newline at end of file diff --git a/source/director.cpp b/source/director.cpp index f7a81e2..a4a282c 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -44,7 +44,7 @@ Director::Director(int argc, std::span argv) { Section::name = Section::Name::GAME; Section::options = Section::Options::GAME_PLAY_1P; #elif _DEBUG - Section::name = Section::Name::CREDITS; + Section::name = Section::Name::HI_SCORE_TABLE; Section::options = Section::Options::GAME_PLAY_1P; #else // NORMAL GAME Section::name = Section::Name::LOGO;