From f95fbf52d751a19fd666c725121472071222144d Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 10 Apr 2026 14:07:16 +0200 Subject: [PATCH] fase 3 de zones --- source/game/scenes/game.cpp | 29 ++++++++++++++++++++++++----- source/game/scenes/game.hpp | 3 ++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/source/game/scenes/game.cpp b/source/game/scenes/game.cpp index 49d71c8..75e5415 100644 --- a/source/game/scenes/game.cpp +++ b/source/game/scenes/game.cpp @@ -799,6 +799,9 @@ auto Game::changeRoom(const std::string& room_path) -> bool { // Cambia la habitación actual current_room_ = room_path; + // Sincroniza la música con la zona de la nueva room + updateMusicForRoom(); + return true; } @@ -1008,13 +1011,29 @@ void Game::initPlayer(const Player::SpawnData& spawn_point, std::shared_ptrsetIgnoreInput(true); } } -// Hace sonar la música +// Safety net: asegura que la música correcta sigue sonando. Delega en +// updateMusicForRoom, que consulta la zona de la room actual. Se llama +// periódicamente desde updatePlaying. void Game::keepMusicPlaying() { - const std::string MUSIC_PATH = mode_ == Mode::GAME ? Defaults::Music::Files::GAME_TRACK : Defaults::Music::Files::TITLE_TRACK; + updateMusicForRoom(); +} - // Si la música no está sonando - if (Audio::get()->getMusicState() == Audio::MusicState::STOPPED) { - Audio::get()->playMusic(MUSIC_PATH); +// Sincroniza la música con la zona de la room actual. Se llama desde +// changeRoom (al entrar a una nueva room) y desde keepMusicPlaying (safety net +// por si la música se detiene). Si la pista objetivo ya está sonando, no hace +// nada (Audio::playMusic tiene early return si el nombre coincide). +void Game::updateMusicForRoom() { + // Modo demo no toca música + if (mode_ != Mode::GAME) { return; } + if (room_ == nullptr) { return; } + + const std::string& target = room_->getMusic(); + if (target.empty()) { return; } + + // Reproducir si no coincide la pista actual o si está parada + if (Audio::get()->getCurrentMusicName() != target + || Audio::get()->getMusicState() == Audio::MusicState::STOPPED) { + Audio::get()->playMusic(target); } } diff --git a/source/game/scenes/game.hpp b/source/game/scenes/game.hpp index b01c22f..5ffab51 100644 --- a/source/game/scenes/game.hpp +++ b/source/game/scenes/game.hpp @@ -83,7 +83,8 @@ class Game { void togglePause(); // Pone el juego en pausa void initPlayer(const Player::SpawnData& spawn_point, std::shared_ptr room); // Inicializa al jugador void endTransition(); // Finaliza la transición entre pantallas - void keepMusicPlaying(); // Hace sonar la música + void keepMusicPlaying(); // Hace sonar la música (safety net, delega en updateMusicForRoom) + void updateMusicForRoom(); // Sincroniza la música con la zona de la room actual void demoInit(); // DEMO MODE: Inicializa las variables para el modo demo void demoCheckRoomChange(float delta_time); // DEMO MODE: Comprueba si se ha de cambiar de habitación #ifdef _DEBUG