О чем этот пример
При разработке игр часто требуется загружать множество ресурсов: изображения, звуки, данные. Phaser 3 предоставляет мощную систему загрузки, включая поддержку файловых пакетов (asset packs). Использование пакетов позволяет организовать загрузку ресурсов структурированно, управлять зависимостями и упростить процесс предзагрузки. В этой статье мы разберем, как создать и загрузить пакет с аудиофайлом и спрайтом, а затем воспроизвести музыку в игре, используя Web Audio API. Это особенно полезно для проектов с большим количеством медиафайлов, где важна четкая организация и производительность.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
FilePackObject = {
pack: {
files: [
{
type: 'audio',
key: 'theme',
url: [
'assets/audio/oedipus_wizball_highscore.ogg',
'assets/audio/oedipus_wizball_highscore.mp3'
]
},
{
type: 'image',
key: 'wizball',
url: 'assets/sprites/wizball.png'
}
]
},
meta: {
generated: '1401380327373',
app: 'Phaser 3 Asset Packer',
url: 'https://phaser.io',
version: '1.0',
copyright: 'Photon Storm Ltd. 2021'
}
};
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.pack('pack1', this.FilePackObject);
}
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
};
const game = new Phaser.Game(config);
Что такое файловый пакет (Asset Pack) в Phaser?
Файловый пакет — это JSON-объект, который описывает набор ресурсов для загрузки в игре. Он может включать аудио, изображения, атласы, данные и другие типы файлов. Пакеты упрощают управление ассетами, особенно когда у вас десятки или сотни файлов. Вместо вызова this.load.image или this.load.audio для каждого ресурса отдельно, вы определяете их все в одном месте.
В примере пакет содержит два файла: аудиофайл с музыкой (в форматах OGG и MP3 для кросс-браузерной совместимости) и изображение спрайта. Phaser автоматически выберет подходящий аудиоформат в зависимости от браузера. Пакет также включает метаданные, такие как информация о генерации и авторские права, но они необязательны для работы.
Структура класса и определение пакета
В коде примера класс Example расширяет Phaser.Scene. Внутри класса определяется объект FilePackObject, который представляет собой файловый пакет. Обратите внимание: пакет задается как свойство класса, что удобно для хранения конфигурации в одном месте.
FilePackObject = {
pack: {
files: [
{
type: 'audio',
key: 'theme',
url: [
'assets/audio/oedipus_wizball_highscore.ogg',
'assets/audio/oedipus_wizball_highscore.mp3'
]
},
{
type: 'image',
key: 'wizball',
url: 'assets/sprites/wizball.png'
}
]
},
meta: {
generated: '1401380327373',
app: 'Phaser 3 Asset Packer',
url: 'https://phaser.io',
version: '1.0',
copyright: 'Photon Storm Ltd. 2021'
}
};
Ключевые поля в пакете:
- type: тип ресурса (например, 'audio' или 'image').
- key: уникальный идентификатор, по которому ресурс будет доступен в коде.
- url: путь к файлу или массив путей для альтернативных форматов (как у аудио).
Метаданные (meta) не влияют на загрузку и используются для информации.
Загрузка пакета в методе preload
В методе preload сцены происходит загрузка ресурсов. Сначала устанавливается базовый URL с помощью this.load.setBaseURL, чтобы не указывать полные пути в каждом url пакета. Затем пакет загружается через this.load.pack.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.pack('pack1', this.FilePackObject);
}
Метод `this.load.pack` принимает два аргумента:
1. Ключ пакета (`'pack1'`) — произвольная строка для идентификации пакета (может быть полезно, если пакетов несколько).
2. Объект пакета (`this.FilePackObject`) — структура, определенная ранее.
Phaser автоматически обработает все файлы из пакета и загрузит их. Для аудио он выберет первый поддерживаемый формат из массива url.
Создание сцены и воспроизведение аудио
После загрузки ресурсов в методе create мы можем их использовать. Сначала добавляется изображение спрайта 'wizball' на сцену с помощью this.add.image. Затем создается аудиообъект через this.sound.add и воспроизводится.
create ()
{
this.add.image(400, 300, 'wizball').setScale(4);
const music = this.sound.add('theme');
music.play();
}
Здесь:
- `this.add.image(400, 300, 'wizball')` — создает спрайт в центре экрана (координаты 400x300) с ключом `'wizball'` из пакета. Метод `setScale(4)` увеличивает спрайт в 4 раза.
- `this.sound.add('theme')` — создает экземпляр аудио, используя ключ `'theme'` из пакета. Это не начинает воспроизведение.
- `music.play()` — запускает воспроизведение аудио. По умолчанию используется Web Audio API, если браузер его поддерживает.
Конфигурация игры и запуск
Конфигурационный объект config определяет основные параметры игры, такие как тип рендерера, размеры холста и сцену. Затем создается экземпляр игры Phaser.Game.
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
pixelArt: true,
scene: Example
};
const game = new Phaser.Game(config);
Параметры конфигурации:
- type: Phaser.AUTO — автоматический выбор рендерера (WebGL или Canvas).
- parent: 'phaser-example' — ID HTML-элемента, в который будет встроен холст игры.
- width и height — размеры игрового поля в пикселях.
- pixelArt: true — включает специальную фильтрацию для пиксель-арт графики, чтобы сохранить четкость спрайтов.
- scene: Example — основная сцена игры, использует наш класс.
После создания объекта game Phaser автоматически запускает жизненный цикл сцены, включая preload и create.
Что попробовать дальше
Использование файловых пакетов в Phaser 3 — это эффективный способ организации ресурсов в играх. Он позволяет загружать аудио, изображения и другие файлы из единой структуры, улучшая читаемость кода и управление ассетами. В рассмотренном примере мы загрузили музыку и спрайт, а затем воспроизвели аудио через Web Audio API. Для экспериментов попробуйте:
1. Добавить больше ресурсов в пакет, например, атласы спрайтов или JSON-данные.
2. Управлять воспроизведением аудио: добавить паузу, регулировку громкости или цикличность через параметры music.play({ loop: true }).
3. Использовать несколько пакетов для разделения ресурсов по уровням игры.
4. Динамически загружать пакеты в зависимости от действий игрока, используя this.load.pack в других методах сцены.
