diff --git a/source/sections/game.cpp b/source/sections/game.cpp index 75dd373..37df4bc 100644 --- a/source/sections/game.cpp +++ b/source/sections/game.cpp @@ -370,17 +370,14 @@ void Game::updateGameStateGameOver(float delta_time) { } if (fade_out_->hasEnded()) { - if (game_completed_timer_ > 0) { - Section::name = Section::Name::CREDITS; // Los jugadores han completado el juego - } else { - Section::name = Section::Name::HI_SCORE_TABLE; // La partida ha terminado con la derrota de los jugadores - } + Section::name = Section::Name::HI_SCORE_TABLE; Section::options = Section::Options::HI_SCORE_AFTER_PLAYING; } } // Gestiona eventos para el estado del final del juego void Game::updateGameStateCompleted(float delta_time) { + fade_out_->update(); updatePlayers(delta_time); updateScoreboard(delta_time); updateBackground(delta_time); @@ -397,7 +394,12 @@ void Game::updateGameStateCompleted(float delta_time) { // Si los jugadores ya no estan y no quedan mensajes en pantalla if (allPlayersAreGameOver() && path_sprites_.empty()) { - setState(State::GAME_OVER); + fade_out_->activate(); + } + + if (fade_out_->hasEnded()) { + Section::name = Section::Name::CREDITS; + Section::options = Section::Options::HI_SCORE_AFTER_PLAYING; } // Incrementa el acumulador al final @@ -823,43 +825,41 @@ void Game::handlePlayerCollision(std::shared_ptr& player, std::shared_pt // Actualiza el estado del tiempo detenido void Game::updateTimeStopped(float delta_time) { - static constexpr float WARNING_THRESHOLD_S = 2.0F; // 120 frames a 60fps → segundos - static constexpr float CLOCK_SOUND_INTERVAL_S = 0.5F; // 30 frames a 60fps → segundos - static constexpr float COLOR_FLASH_INTERVAL_S = 0.25F; // 15 frames a 60fps → segundos + static constexpr float WARNING_THRESHOLD_S = 2.0F; + static constexpr float CLOCK_SOUND_INTERVAL_S = 0.5F; + static constexpr float COLOR_FLASH_INTERVAL_S = 0.25F; if (time_stopped_timer_ > 0) { time_stopped_timer_ -= delta_time; // Fase de advertencia (últimos 2 segundos) if (time_stopped_timer_ <= WARNING_THRESHOLD_S) { - static float last_sound_time_ = 0.0F; - // CLAC al entrar en fase de advertencia if (!time_stopped_flags_.warning_phase_started) { playSound("clock.wav"); time_stopped_flags_.warning_phase_started = true; - last_sound_time_ = 0.0F; // Reset para empezar el ciclo rápido + time_stopped_sound_timer_ = 0.0F; // Reset para empezar el ciclo rápido } - last_sound_time_ += delta_time; + time_stopped_sound_timer_ += delta_time; - if (last_sound_time_ >= CLOCK_SOUND_INTERVAL_S) { + if (time_stopped_sound_timer_ >= CLOCK_SOUND_INTERVAL_S) { balloon_manager_->normalColorsToAllBalloons(); playSound("clock.wav"); - last_sound_time_ = 0.0F; + time_stopped_sound_timer_ = 0.0F; time_stopped_flags_.color_flash_sound_played = false; // Reset flag para el próximo intervalo - } else if (last_sound_time_ >= COLOR_FLASH_INTERVAL_S && !time_stopped_flags_.color_flash_sound_played) { + } else if (time_stopped_sound_timer_ >= COLOR_FLASH_INTERVAL_S && !time_stopped_flags_.color_flash_sound_played) { balloon_manager_->reverseColorsToAllBalloons(); playSound("clock.wav"); time_stopped_flags_.color_flash_sound_played = true; // Evita que suene múltiples veces } + } else { // Fase normal - solo sonido ocasional - static float sound_timer_ = 0.0F; - sound_timer_ += delta_time; - if (sound_timer_ >= CLOCK_SOUND_INTERVAL_S) { + time_stopped_sound_timer_ += delta_time; + if (time_stopped_sound_timer_ >= CLOCK_SOUND_INTERVAL_S) { playSound("clock.wav"); - sound_timer_ = 0.0F; + time_stopped_sound_timer_ = 0.0F; } } @@ -959,12 +959,14 @@ void Game::enableTimeStopItem() { balloon_manager_->stopAllBalloons(); balloon_manager_->reverseColorsToAllBalloons(); time_stopped_timer_ = TIME_STOPPED_DURATION_S; + time_stopped_sound_timer_ = 0.0F; time_stopped_flags_.reset(); // Resetea flags al activar el item } // Deshabilita el efecto del item de detener el tiempo void Game::disableTimeStopItem() { - time_stopped_timer_ = 0; + time_stopped_timer_ = 0.0F; + time_stopped_sound_timer_ = 0.0F; balloon_manager_->startAllBalloons(); balloon_manager_->normalColorsToAllBalloons(); } @@ -1884,6 +1886,7 @@ void Game::setState(State state) { case State::COMPLETED: // Para la música y elimina todos los globos e items stopMusic(); // Detiene la música balloon_manager_->destroyAllBalloons(); // Destruye a todos los globos + disableTimeStopItem(); // Deshabilita el temporizador de tiempo playSound("power_ball_explosion.wav"); // Sonido de destruir todos los globos destroyAllItems(); // Destruye todos los items background_->setAlpha(0); // Elimina el tono rojo de las últimas pantallas diff --git a/source/sections/game.hpp b/source/sections/game.hpp index d759727..d24a330 100644 --- a/source/sections/game.hpp +++ b/source/sections/game.hpp @@ -133,7 +133,7 @@ class Game { std::vector> game_text_textures_; // Vector con las texturas para los sprites con textos - std::vector> item_animations_; // Vector con las animaciones de los items + std::vector> item_animations_; // Vector con las animaciones de los items std::vector> player1_animations_; // Vector con las animaciones del jugador 1 std::vector> player2_animations_; // Vector con las animaciones del jugador 2 @@ -163,6 +163,7 @@ class Game { float game_completed_timer_ = 0.0F; // Acumulador de tiempo para el tramo final (milisegundos) float game_over_timer_ = 0.0F; // Timer para el estado de fin de partida (milisegundos) float time_stopped_timer_ = 0.0F; // Temporizador para llevar la cuenta del tiempo detenido + float time_stopped_sound_timer_ = 0.0F; // Temporizador para controlar el sonido del tiempo detenido int menace_ = 0; // Nivel de amenaza actual int menace_threshold_ = 0; // Umbral del nivel de amenaza. Si el nivel de amenaza cae por debajo del umbral, se generan más globos. Si el umbral aumenta, aumenta el número de globos State state_ = State::FADE_IN; // Estado