SoundManager: инициализация и конфигурация

В Phaser SoundManager является центральным компонентом для работы с аудио. Он управляет воспроизведением звуков, музыки, эффектов и позволяет гибко настраивать параметры звуковых дорожек. Инициализация SoundManager происходит автоматически при создании сцены, если в конфигурации игры включена поддержка аудио.

Простейшая конфигурация игры с аудио выглядит следующим образом:

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    scene: {
        preload: preload,
        create: create
    },
    audio: {
        disableWebAudio: false
    }
};

const game = new Phaser.Game(config);

Здесь ключ audio.disableWebAudio определяет, будет ли использоваться Web Audio API (рекомендуется) или fallback на HTML5 Audio. Использование Web Audio обеспечивает низкую задержку и богатые возможности обработки звука.


Загрузка и добавление звуков

Для работы с аудио необходимо сначала загрузить ресурсы через метод preload сцены. Phaser поддерживает форматы MP3, OGG и WAV.

function preload() {
    this.load.audio('background', 'assets/audio/background.mp3');
    this.load.audio('jump', 'assets/audio/jump.wav');
}

После загрузки звуки становятся доступными через this.sound.add():

function create() {
    const bgMusic = this.sound.add('background', {
        loop: true,
        volume: 0.5
    });

    const jumpSound = this.sound.add('jump', {
        volume: 1.0
    });
    
    bgMusic.play();
}

Ключевые параметры при добавлении звука:

  • loop — определяет, будет ли звук зациклен.
  • volume — уровень громкости (0.0–1.0).
  • detune — настройка высоты тона в центах.
  • rate — скорость воспроизведения (0.5–2.0).

Управление воспроизведением

SoundManager предоставляет полный контроль над воспроизведением:

jumpSound.play();
jumpSound.pause();
jumpSound.stop();
jumpSound.resume();

Можно использовать события для отслеживания состояния звуков:

jumpSound.on('complete', () => {
    console.log('Звук завершен');
});

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


Группировка и управление несколькими звуками

Phaser позволяет управлять множеством звуков одновременно. Для этого можно использовать массивы или кастомные группы:

const effects = [
    this.sound.add('jump'),
    this.sound.add('explosion'),
    this.sound.add('coin')
];

effects.forEach(sound => {
    sound.play();
});

Для массового изменения параметров звуков используется this.sound.setVolume() или this.sound.pauseAll().

this.sound.setVolume(0.2); // уменьшение громкости всех звуков
this.sound.pauseAll();     // приостановка всех звуков

Конфигурация SoundManager на уровне сцены

На уровне сцены SoundManager можно настроить глобальные параметры:

this.sound.mute = false;       // отключение всех звуков
this.sound.volume = 0.7;       // глобальная громкость
this.sound.context.resume();    // восстановление Web Audio контекста

Особенность Web Audio API в том, что воспроизведение звука может быть приостановлено браузером до первого взаимодействия пользователя. В этом случае вызов context.resume() решает проблему.


Простое создание фоновой музыки и эффектов

Фоновая музыка обычно зацикливается и имеет меньшую громкость:

const music = this.sound.add('background', { loop: true, volume: 0.3 });
music.play();

Эффекты выполняются кратковременно и с полной громкостью:

this.input.on('pointerdown', () => {
    this.sound.play('jump');
});

Использование this.sound.play('key') напрямую удобно для коротких звуков, а this.sound.add('key') подходит для более сложного управления, включая паузу и зацикливание.


Продвинутые настройки

  • Детюн и скорость: Изменение detune или rate позволяет создавать эффекты ускорения, замедления или изменения тона.
  • Пространственное аудио: В Phaser 3 поддерживается позиционное аудио через setPosition(x, y, z) и setPan(pan).
  • Автоматическое управление памятью: Функции destroy() освобождают ресурсы при окончании использования звука.

Пример с позиционным эффектом:

const effect = this.sound.add('jump');
effect.setPan(-1);  // звук слева
effect.play();

Использование SoundManager в Phaser обеспечивает гибкое, эффективное и детализированное управление аудио, позволяя реализовывать как простые звуковые эффекты, так и сложные музыкальные сцены с позиционным и динамическим управлением.