Phaser — это мощная библиотека для создания 2D-игр на JavaScript, предоставляющая удобные инструменты для работы с графикой, анимацией и взаимодействием с пользователем. Одним из ключевых элементов является система загрузки ресурсов, таких как изображения, спрайты, аудио и данные.
Загрузка ресурсов в Phaser осуществляется через объект
this.load внутри сцены. Этот объект
содержит методы для загрузки различных типов данных:
this.load.image(key, url) — загружает
изображение по указанному URL и присваивает ему ключ key
для последующего использования.this.load.spritesheet(key, url, { frameWidth, frameHeight })
— загружает спрайт-лист с указанием размеров каждого кадра.this.load.audio(key, urls) — загружает
аудиофайл, поддерживает массив URL для разных форматов (например, mp3 и
ogg).this.load.json(key, url) — загружает
JSON-файл с данными, пригодный для конфигураций или уровня игры.Методы загрузки не выполняют немедленного отображения или воспроизведения ресурсов. Они помещают их в кэш памяти Phaser, после чего можно использовать в любой части сцены.
Phaser обрабатывает загрузку асинхронно. Для управления процессом
используются события объекта LoaderPlugin:
this.load.on('progress', callback) —
вызывается с прогрессом загрузки в диапазоне от 0 до 1.this.load.on('filecomplete', callback)
— срабатывает по завершении загрузки конкретного файла.this.load.on('complete', callback) —
вызывается после завершения загрузки всех ресурсов сцены.Пример отслеживания прогресса:
this.load.on('progress', function (value) {
console.log(`Загрузка: ${Math.round(value * 100)}%`);
});
this.load.on('complete', function () {
console.log('Все ресурсы загружены');
});
Phaser позволяет задать базовый путь к ресурсам, чтобы не указывать
полный URL для каждого файла. Для этого используется свойство
this.load.setBaseURL(url):
this.load.setBaseURL('https://example.com/assets/');
this.load.image('player', 'sprites/player.png'); // Полный путь: https://example.com/assets/sprites/player.png
Базовый путь особенно удобен при работе с большим количеством ресурсов, расположенных на одном сервере. Он может быть абсолютным (с указанием протокола и домена) или относительным (относительно корня проекта).
При работе с внешними ресурсами часто возникает необходимость загружать файлы с другого домена. По умолчанию браузеры применяют политику CORS, и если сервер не разрешает кросс-доменные запросы, загрузка ресурсов может быть заблокирована.
Phaser поддерживает кросс-доменную загрузку через настройку свойства
crossOrigin:
this.load.setCORS('anonymous'); // или 'use-credentials'
this.load.image('background', 'https://cdn.example.com/bg.png');
Параметр 'anonymous' позволяет загружать изображения без
передачи учетных данных, что подходит для большинства публичных
ресурсов. 'use-credentials' требует наличия заголовка
Access-Control-Allow-Credentials на сервере и используется,
когда ресурсы защищены и необходима авторизация.
Для аудио и видео также возможно указание кросс-домена через дополнительные параметры, передаваемые в методы загрузки:
this.load.audio('theme', [
'https://cdn.example.com/audio/theme.mp3',
'https://cdn.example.com/audio/theme.ogg'
], { crossOrigin: 'anonymous' });
Часто проект содержит папки с разными типами ресурсов: изображения, аудио, шрифты, данные. Для удобства можно задать несколько базовых путей и комбинировать их с относительными URL:
this.load.setBaseURL('https://cdn.example.com/assets/');
this.load.image('enemy', 'sprites/enemy.png'); // assets/sprites/enemy.png
this.load.audio('hit', 'sounds/hit.wav'); // assets/sounds/hit.wav
this.load.json('level1', 'data/level1.json'); // assets/data/level1.json
Это упрощает перенос проекта на другой сервер или использование разных серверов для статических ресурсов.
Эффективное использование базовых путей и кросс-доменных настроек позволяет создавать игры с большим количеством внешних ресурсов без проблем с загрузкой и совместимостью.
Для крупных проектов рекомендуется создавать отдельную Preloader сцену, которая отвечает за загрузку всех ресурсов перед запуском основной сцены:
class Preloader extends Phaser.Scene {
constructor() {
super({ key: 'Preloader' });
}
preload() {
this.load.setBaseURL('https://cdn.example.com/assets/');
this.load.setCORS('anonymous');
this.load.image('player', 'sprites/player.png');
this.load.audio('theme', ['audio/theme.mp3', 'audio/theme.ogg']);
this.load.on('progress', (value) => {
console.log(`Загрузка: ${Math.round(value * 100)}%`);
});
}
create() {
this.scene.start('MainScene');
}
}
Такой подход обеспечивает плавное и предсказуемое поведение игры, минимизирует задержки и ошибки при доступе к ресурсам.