Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fc8233ef57 | |||
| ef2c13b011 | |||
| 69e337393a | |||
| 56c3f978d3 |
@@ -281,6 +281,17 @@ void Audio::enableMusic(bool value) {
|
|||||||
setMusicVolume(config_.music_volume);
|
setMusicVolume(config_.music_volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Silencia o restaura un grup de sons concret sense alterar config_ (el volum
|
||||||
|
// que l'usuari va triar) ni els altres grups. Silenciar posa la ganancia del
|
||||||
|
// grup a 0; restaurar-la torna al volum efectiu normal (que ja aplica els gates
|
||||||
|
// master/sound i el volum de l'usuari). A diferència de setSoundVolume, no
|
||||||
|
// xafa config_.sound_volume, así que el menu de servei segueix mostrant i
|
||||||
|
// operant el volum real durant la demo.
|
||||||
|
void Audio::silenceGroup(Group group, bool silenced) {
|
||||||
|
const float VOL = silenced ? 0.0F : effectiveVolume(config_.sound_volume, sound_enabled_);
|
||||||
|
engine_->setSoundVolume(VOL, static_cast<int>(group));
|
||||||
|
}
|
||||||
|
|
||||||
// Inicialitza SDL Audio y el motor Ja::Engine owned.
|
// Inicialitza SDL Audio y el motor Ja::Engine owned.
|
||||||
void Audio::initSDLAudio() {
|
void Audio::initSDLAudio() {
|
||||||
if (!SDL_Init(SDL_INIT_AUDIO)) {
|
if (!SDL_Init(SDL_INIT_AUDIO)) {
|
||||||
|
|||||||
@@ -128,6 +128,12 @@ class Audio {
|
|||||||
// --- Configuración de sons ---
|
// --- Configuración de sons ---
|
||||||
void enableSound(bool value); // Estableix l'estat dels sons (reaplica volum)
|
void enableSound(bool value); // Estableix l'estat dels sons (reaplica volum)
|
||||||
void toggleSound() { enableSound(!sound_enabled_); } // Alterna l'estat dels sons (reaplica volum)
|
void toggleSound() { enableSound(!sound_enabled_); } // Alterna l'estat dels sons (reaplica volum)
|
||||||
|
// Silencia (o restaura) un únic grup de sons sense tocar el volum cachejat
|
||||||
|
// de l'usuari ni la resta de grups. Pensat per a l'attract/demo: vol callar
|
||||||
|
// els SFX de joc (Group::GAME) pero mantenir els del menu de servei
|
||||||
|
// (Group::INTERFACE) i la música. En restaurar, reaplica el volum efectiu
|
||||||
|
// normal del canal (que ja respecta els gates master/sound).
|
||||||
|
void silenceGroup(Group group, bool silenced);
|
||||||
|
|
||||||
// --- Configuración de música ---
|
// --- Configuración de música ---
|
||||||
void enableMusic(bool value); // Estableix l'estat de la música (reaplica volum)
|
void enableMusic(bool value); // Estableix l'estat de la música (reaplica volum)
|
||||||
|
|||||||
@@ -43,6 +43,11 @@ namespace {
|
|||||||
InputAction::THRUST,
|
InputAction::THRUST,
|
||||||
InputAction::SHOOT,
|
InputAction::SHOOT,
|
||||||
InputAction::START};
|
InputAction::START};
|
||||||
|
|
||||||
|
// Color de les frases d'inici/fi de fase (àmbar neon). És propi del joc i
|
||||||
|
// independent del "PULSA START" del títol (ara blanc): abans compartien la
|
||||||
|
// mateixa constant i en posar el títol en blanc aquestes frases també ho feien.
|
||||||
|
constexpr SDL_Color STAGE_MESSAGE_COLOR = {.r = 255, .g = 200, .b = 70, .a = 255};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
GameScene::GameScene(SDLManager& sdl, SceneContext& context)
|
GameScene::GameScene(SDLManager& sdl, SceneContext& context)
|
||||||
@@ -165,10 +170,10 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
|
|||||||
context_.advanceDemoScenario();
|
context_.advanceDemoScenario();
|
||||||
stage_manager_->initDemo(SC.stage);
|
stage_manager_->initDemo(SC.stage);
|
||||||
demo_timer_ = DEMO_DURATION;
|
demo_timer_ = DEMO_DURATION;
|
||||||
// Silenciar els SFX durant la demo (la música segueix). Guardem l'estat
|
// Silenciar només els SFX de joc (Group::GAME) durant la demo: la música
|
||||||
// previ per restaurar-lo al destructor sense xafar la preferència de l'usuari.
|
// i els sons del menu de servei (Group::INTERFACE) segueixen sonant. No
|
||||||
sound_was_enabled_ = Audio::get()->isSoundEnabled();
|
// toquem el volum global ni la preferència de l'usuari.
|
||||||
Audio::get()->enableSound(false);
|
Audio::get()->silenceGroup(Audio::Group::GAME, true);
|
||||||
// El fons (graella) ha d'aparèixer ja muntat: la demo és una partida en marxa.
|
// El fons (graella) ha d'aparèixer ja muntat: la demo és una partida en marxa.
|
||||||
playfield_.completeBuild();
|
playfield_.completeBuild();
|
||||||
// La cortinilla arrenca tapant i cau per destapar la demo (continua el
|
// La cortinilla arrenca tapant i cau per destapar la demo (continua el
|
||||||
@@ -242,9 +247,14 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GameScene::~GameScene() {
|
GameScene::~GameScene() {
|
||||||
// Si la demo havia silenciat els SFX, restaurar l'estat previ en sortir.
|
// En sortir de la demo, primer parem qualsevol SFX encara sonant (p. ex. la
|
||||||
|
// veu de "fase completa" que la demo va llançar muteada): si no, en restaurar
|
||||||
|
// el volum del grup el motor reaplicaria la ganancia al canal viu i el so es
|
||||||
|
// colaria a la pantalla de títol. Després restaurem el grup GAME per al
|
||||||
|
// pròxim joc real.
|
||||||
if (match_config_.mode == GameConfig::Mode::DEMO) {
|
if (match_config_.mode == GameConfig::Mode::DEMO) {
|
||||||
Audio::get()->enableSound(sound_was_enabled_);
|
Audio::get()->stopAllSounds();
|
||||||
|
Audio::get()->silenceGroup(Audio::Group::GAME, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1031,7 +1041,7 @@ void GameScene::drawStageMessage(const std::string& message) {
|
|||||||
// Render only the partial message (typewriter effect) amb el color
|
// Render only the partial message (typewriter effect) amb el color
|
||||||
// ambre neon del "PRESS START" del títol — unifica el feel dels missatges.
|
// ambre neon del "PRESS START" del títol — unifica el feel dels missatges.
|
||||||
Vec2 pos = {.x = x, .y = y};
|
Vec2 pos = {.x = x, .y = y};
|
||||||
text_.render(partial_message, pos, scale, SPACING, 1.0F, Defaults::Title::Colors::PRESS_START);
|
text_.render(partial_message, pos, scale, SPACING, 1.0F, STAGE_MESSAGE_COLOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|||||||
@@ -110,7 +110,6 @@ class GameScene final : public Scene {
|
|||||||
std::array<Systems::Demo::DemoPilot, 2> demo_pilots_;
|
std::array<Systems::Demo::DemoPilot, 2> demo_pilots_;
|
||||||
std::array<Systems::Demo::Control, 2> demo_ctrls_{}; // Control per nau al frame actual
|
std::array<Systems::Demo::Control, 2> demo_ctrls_{}; // Control per nau al frame actual
|
||||||
float demo_timer_{0.0F}; // Temps restant de la demo (→ LOGO)
|
float demo_timer_{0.0F}; // Temps restant de la demo (→ LOGO)
|
||||||
bool sound_was_enabled_{true}; // Estat dels SFX abans de la demo (per restaurar-lo)
|
|
||||||
|
|
||||||
// Funciones privades
|
// Funciones privades
|
||||||
// bullet_velocity: velocitat de la bala que ha causat la mort (Vec2{} si no
|
// bullet_velocity: velocitat de la bala que ha causat la mort (Vec2{} si no
|
||||||
|
|||||||
Reference in New Issue
Block a user