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

Фоновая музыка создает атмосферу и погружает игрока в ваш мир. Phaser предлагает гибкую систему аудио, которую можно настроить под разные задачи. В этой статье мы разберем базовый пример загрузки и воспроизведения аудиофайла с использованием HTML5 Audio API вместо Web Audio. Этот подход может быть полезен для простых проектов или для обеспечения совместимости на старых устройствах, где поддержка Web Audio неполная.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.audio('theme', [
            'assets/audio/oedipus_wizball_highscore.ogg',
            'assets/audio/oedipus_wizball_highscore.mp3'
        ]);

        this.load.image('wizball', 'assets/sprites/wizball.png');
    }

    create ()
    {
        this.add.image(400, 300, 'wizball').setScale(4);

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

        music.play();
    }
}

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

const game = new Phaser.Game(config);

Настройка загрузки аудио и изображения

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

Загружаем аудиофайл с ключом 'theme'. Phaser позволяет указать массив путей к одному и тому же аудио в разных форматах (OGG и MP3). Это стандартная практика для кросс-браузерной совместимости, так как разные браузеры поддерживают разные аудиокодеки.

this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.audio('theme', [
    'assets/audio/oedipus_wizball_highscore.ogg',
    'assets/audio/oedipus_wizball_highscore.mp3'
]);

Также для наглядности загружается спрайт 'wizball', который будет отображаться на сцене.

this.load.image('wizball', 'assets/sprites/wizball.png');

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

В методе create() размещаем загруженное изображение и, что самое важное, подготавливаем и запускаем музыку.

Сначала добавляем спрайт в центр экрана и увеличиваем его.

this.add.image(400, 300, 'wizball').setScale(4);

Затем создаем аудиообъект, обращаясь к менеджеру звуков this.sound. Метод this.sound.add('theme') создает экземпляр Sound на основе ранее загруженного аудио с ключом 'theme'.

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

Чтобы начать воспроизведение, достаточно вызвать метод play() у созданного объекта. Музыка начнет играть сразу после старта сцены.

music.play();

Конфигурация игры: выбор HTML5 Audio

Ключевой момент для понимания этого примера находится в конфигурационном объекте игры. По умолчанию Phaser использует более мощный и современный Web Audio API. Однако в этой конфигурации явно указано использовать HTML5 Audio.

В поле audio объекта config устанавливается свойство disableWebAudio: true. Это заставляет Phaser использовать HTML5 Audio API, что может быть проще, но имеет больше ограничений (например, по микшированию звуков).

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    pixelArt: true,
    scene: Example,
    audio: {
        disableWebAudio: true // Включаем режим HTML5 Audio
    }
};

Инициализация игры стандартная.

const game = new Phaser.Game(config);

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

Вы разобрали базовый паттерн для работы со звуком в Phaser: загрузка в preload(), создание объекта в create() и управление через метод play(). Важно понимать разницу между HTML5 Audio и Web Audio, которую можно контролировать в конфиге. Для экспериментов попробуйте: добавить управление музыкой (пауза, остановка), настроить громкость через setVolume, зациклить трек с помощью параметра loop в методе play() или переключить конфиг на использование Web Audio API, убрав опцию disableWebAudio, чтобы оценить разницу в возможностях.