События звука: complete, looped, stop

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


Подключение и подготовка аудио

Для работы с аудио сначала необходимо загрузить ресурсы через загрузчик Phaser. Обычно используется метод this.load.audio внутри метода preload() сцены:

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

После загрузки аудио создаются объекты типа Phaser.Sound.BaseSound или его наследники (Phaser.Sound.WebAudioSound, Phaser.Sound.HTML5AudioSound) через метод this.sound.add:

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

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

  • loop – автоматическое повторение воспроизведения.
  • volume – уровень громкости (0–1).
  • rate – скорость воспроизведения.
  • detune – смещение частоты в центах, для создания эффектов изменения тона.

Событие complete

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

effectSound.on('complete', () => {
    console.log('Эффект завершился');
});
effectSound.play();

Особенности события complete:

  • Не вызывается для звуков с параметром loop: true.
  • Можно использовать для цепочки звуков: один звук запускается после завершения предыдущего.
  • Поддерживает удаление слушателя через off для предотвращения многократных вызовов:
effectSound.off('complete');

Событие looped

Событие looped срабатывает каждый раз, когда звуковой файл с параметром loop: true начинает новый цикл воспроизведения.

bgMusic.on('looped', () => {
    console.log('Музыка перезапустилась');
});
bgMusic.play();

Особенности:

  • Отлично подходит для музыкальных дорожек, где необходимо синхронизировать анимацию или эффекты с началом нового цикла.
  • Можно комбинировать с volume или rate, чтобы динамически изменять характеристики звука на каждом новом цикле.

Пример динамического изменения громкости при каждом повторе:

let volume = 0.5;
bgMusic.on('looped', () => {
    volume = (volume + 0.1) % 1;
    bgMusic.setVolume(volume);
});

Событие stop

Событие stop вызывается при явной остановке воспроизведения звука через метод stop() или при уничтожении звукового объекта. Это полезно для управления состоянием игры и предотвращения наложения нескольких звуков.

effectSound.on('stop', () => {
    console.log('Звук был остановлен');
});
effectSound.play();

// Прерывание воспроизведения через 2 секунды
this.time.delayedCall(2000, () => {
    effectSound.stop();
});

Особенности события stop:

  • Работает как для одиночных эффектов, так и для зацикленных звуков.
  • Позволяет освобождать ресурсы и корректно синхронизировать игровые события.

Практическое применение событий

Сценарии использования:

  1. Музыкальная заставка с переходом к игре:

    • Запуск фоновой музыки.
    • Событие complete или looped для синхронизации появления меню.
  2. Эффекты оружия или взрывов:

    • Звуки effect с событием complete, после которого можно запускать анимацию взрыва.
  3. Динамическая музыка:

    • Использование looped для изменения громкости, фильтров или добавления новых инструментов при каждом повторе.
  4. Остановка звука при смене сцены:

    • Вызов stop() для всех текущих звуков и обработка события stop для очистки ресурсов.

Советы по работе со звуком в Phaser

  • Всегда использовать off для удаления слушателей, чтобы избежать утечек памяти при повторном создании звуков.
  • Проверять, поддерживает ли целевая платформа Web Audio API, иначе Phaser автоматически использует HTML5 Audio.
  • Для больших проектов рекомендуется создавать централизованный AudioManager, который управляет всеми событиями complete, looped и stop.
  • Комбинировать события с таймерами и анимациями Phaser для достижения полной синхронизации аудио с игровыми сценами.

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