Глобальная громкость и mute

Phaser предоставляет гибкий механизм работы с аудио, позволяющий контролировать как отдельные звуки, так и глобальные настройки звукового движка. Управление глобальной громкостью и состоянием mute позволяет централизованно регулировать все звуковые эффекты и музыку в игре, что особенно важно для создания удобного пользовательского опыта.


Глобальная громкость через game.sound

В Phaser глобальная громкость задаётся через объект SoundManager, доступный через this.sound в сцене или game.sound в глобальном контексте. Основные свойства:

  • volume — задаёт коэффициент общей громкости от 0 до 1.

    this.sound.volume = 0.5; // Устанавливает половинную громкость для всех звуков
  • Изменение volume динамически влияет на все активные и будущие звуки, которые будут воспроизводиться после изменения.

  • При работе с несколькими сценами важно учитывать, что глобальная громкость применяется ко всем сценам, использующим один и тот же SoundManager.


Состояние mute

Свойство mute объекта SoundManager позволяет полностью отключать звук:

this.sound.mute = true; // Полностью выключает все звуки
this.sound.mute = false; // Включает звук обратно
  • При включенном mute воспроизведение звуков продолжается, но аудио будет невоспринимаемо пользователем.
  • Состояние mute удобно использовать для реализации кнопки «выключить звук» или режима без звука на мобильных устройствах.

Управление глобальной громкостью и mute для отдельных звуков

Хотя глобальная громкость и mute управляют всеми звуками одновременно, отдельные звуки также могут иметь свои локальные настройки:

let music = this.sound.add('backgroundMusic', { volume: 0.8, loop: true });
music.play();

let sfx = this.sound.add('explosion', { volume: 1 });
sfx.play();
  • Если this.sound.volume изменяется глобально, локальные громкости умножаются на глобальный коэффициент:
эффективная громкость = локальная громкость * глобальная громкость
  • При глобальном mute звуки всё равно продолжают проигрываться, но без слышимого эффекта.

Динамическое изменение громкости во время игры

Phaser позволяет плавно изменять громкость с использованием tween-анимаций или собственных функций:

this.tweens.add({
    targets: this.sound,
    volume: 0,
    duration: 2000, // Плавное снижение за 2 секунды
    onComplete: () => console.log('Громкость полностью уменьшена')
});
  • Такой подход применим для создания эффектов затухания музыки при смене сцены или при событиях в игре.
  • Можно комбинировать с локальными tween-ами для отдельных звуков, сохраняя глобальные настройки.

Практические рекомендации

  1. Хранение состояния mute и громкости Для корректного поведения между сценами рекомендуется хранить текущие настройки в глобальном объекте игры или localStorage, чтобы восстановить их при перезапуске игры.

  2. Использование методов setVolume и setMute Для единообразного управления звуком можно использовать методы:

    this.sound.setVolume(0.7);
    this.sound.setMute(false);
  3. Обработка пользовательского ввода

    • Кнопки и горячие клавиши могут переключать mute и регулировать громкость.
    • На мобильных устройствах важно проверять, что звуки запускаются только после взаимодействия пользователя, иначе браузеры могут блокировать автозапуск аудио.

Взаимодействие с различными форматами аудио

Phaser поддерживает Web Audio API и HTML5 Audio. Поведение громкости и mute может немного отличаться:

  • Web Audio: плавное изменение громкости и поддержка множества звуков одновременно.
  • HTML5 Audio: меньше возможностей для tween-анимаций, более ограниченная поддержка многоканального звука.

При работе с глобальными настройками рекомендуется использовать Web Audio, чтобы достичь точного контроля над громкостью и mute.


Пример комплексного управления

class MainScene extends Phaser.Scene {
    create() {
        this.music = this.sound.add('bgMusic', { loop: true });
        this.music.play();

        this.input.keyboard.on('keydown-M', () => {
            this.sound.mute = !this.sound.mute;
        });

        this.input.keyboard.on('keydown-UP', () => {
            this.sound.volume = Phaser.Math.Clamp(this.sound.volume + 0.1, 0, 1);
        });

        this.input.keyboard.on('keydown-DOWN', () => {
            this.sound.volume = Phaser.Math.Clamp(this.sound.volume - 0.1, 0, 1);
        });
    }
}
  • Клавиша M переключает mute, стрелки вверх/вниз изменяют глобальную громкость.
  • Все звуки сцены подчиняются этим глобальным настройкам, при этом локальные уровни громкости остаются пропорциональными.

Эффективное управление глобальной громкостью и mute обеспечивает централизованный контроль звука, упрощает реализацию пользовательских настроек и позволяет создавать плавные аудиоэффекты при смене сцен и игровых событий.