О чем этот пример

Звук и музыка — ключевые элементы атмосферы любой игры. В Phaser управление аудио интуитивно понятно, но содержит важные нюансы, особенно при работе с различными форматами файлов для кросс-браузерной совместимости. Эта статья на практическом примере покажет, как загрузить и запустить музыку в вашем проекте, а также как настроить поведение звука при переключении вкладок браузера.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    text;

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.text = this.add.text(10, 10, 'Loading audio ...', { font: '16px Courier', fill: '#00ff00' });

        this.load.audio('dafunk', [
            'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).ogg',
            'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).mp3',
            'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).m4a'
        ]);
    }

    create ()
    {
        this.sound.pauseOnBlur = false;

        const music = this.sound.add('dafunk');

        music.play();

        this.text.setText('Playing Dafunk - Hardcore Power (We Believe In Goa - Remix)');
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Структура сцены и предзагрузка

В Phaser загрузка ресурсов, включая аудио, происходит в методе preload() сцены. Это гарантирует, что к моменту запуска игры все необходимые файлы будут готовы.

В нашем примере класс сцены Example содержит свойство text для отображения статуса. Первым делом в preload() мы указываем базовый URL для загрузки и создаем текстовый объект.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.text = this.add.text(10, 10, 'Loading audio ...', { font: '16px Courier', fill: '#00ff00' });
    // ... загрузка аудио
}

Загрузка аудио с поддержкой нескольких форматов

Разные браузеры поддерживают разные аудиоформаты. Чтобы ваша музыка играла везде, Phaser позволяет указать массив файлов в одном вызове метода this.load.audio(). Движок автоматически выберет первый поддерживаемый браузером формат.

Ключ 'dafunk' — это внутренний идентификатор (asset key), по которому мы позже получим доступ к звуку.

this.load.audio('dafunk', [
    'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).ogg',
    'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).mp3',
    'assets/audio/Dafunk - Hardcore Power (We Believe In Goa - Remix).m4a'
]);

Создание и воспроизведение звука

Как только все ресурсы загружены, Phaser автоматически вызывает метод create(). Здесь происходит инициализация игровых объектов и логики.

Перед созданием звукового объекта важно настроить глобальное поведение аудиосистемы. Свойство this.sound.pauseOnBlur = false предотвращает паузу музыки, когда пользователь переключается на другую вкладку браузера.

create ()
{
    this.sound.pauseOnBlur = false;

    const music = this.sound.add('dafunk');
    music.play();

    this.text.setText('Playing Dafunk - Hardcore Power (We Believe In Goa - Remix)');
}

Метод this.sound.add('dafunk') создает и возвращает экземпляр звука на основе ранее загруженного ключа. Вызов music.play() запускает его воспроизведение.

Конфигурация игры и запуск

Код вне класса сцены отвечает за создание экземпляра игры Phaser.Game. В объекте конфигурации config указывается тип рендерера, размеры холста, ID родительского HTML-элемента и класс основной сцены.

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

После создания объекта game Phaser берет на себя управление жизненным циклом сцены, вызывая preload(), create(), а затем update() на каждом кадре.

Что попробовать дальше

Вы освоили базовый цикл работы со звуком в Phaser: от загрузки нескольких форматов до управления воспроизведением. Для экспериментов попробуйте добавить управление громкостью через music.setVolume(), запустить звук с задержкой или в цикле, используя параметры метода play(). Также изучите другие методы объекта звука, такие как pause(), resume() и stop(), чтобы создать полноценную аудиосистему для своей игры.