О чем этот пример
Векторная графика (SVG) — это мощный инструмент для создания интерфейсов и игровых элементов, которые остаются чёткими на любом разрешении. Phaser позволяет легко загружать SVG-файлы и использовать их как обычные текстуры. В этой статье мы разберём пример загрузки векторных изображений, рассмотрим разные варианты синтаксиса и покажем, как это может упростить управление ассетами в вашем проекте.
Версия 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.svg('pencil', 'assets/svg/pencil.svg');
this.load.svg('cartman', 'assets/svg/cartman.svg');
this.load.svg('fireflower', 'assets/svg/fireflower.svg');
// this.load.svg({ key: 'pencil', file: 'assets/svg/pencil.svg' });
// this.load.svg({ key: 'cartman', file: 'assets/svg/cartman.svg' });
// this.load.setPath('assets/svg');
// this.load.svg([
// { key: 'pencil' },
// { key: 'cartman' },
// ]);
}
create ()
{
this.add.image(400, 300, 'fireflower');
this.add.image(400, 300, 'pencil');
this.add.image(150, 300, 'cartman');
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#efefef',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Базовый способ: загрузка по одному файлу
Самый простой и прямой способ загрузки — использовать метод this.load.svg(), передавая ему ключ (key) для последующего обращения и путь к файлу.
В методе preload() сцены сначала задаётся базовый URL для всех последующих загрузок с помощью this.load.setBaseURL(). Это позволяет указывать только относительные пути для файлов.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.svg('pencil', 'assets/svg/pencil.svg');
this.load.svg('cartman', 'assets/svg/cartman.svg');
this.load.svg('fireflower', 'assets/svg/fireflower.svg');
}
Каждый вызов this.load.svg регистрирует файл в менеджере загрузок Phaser под своим уникальным ключом ('pencil', 'cartman', 'fireflower'). После завершения загрузки эти ключи можно использовать для создания спрайтов.
Альтернативный синтаксис: загрузка через объект
Phaser предоставляет более гибкий вариант того же метода, где параметры передаются в виде объекта. Это может быть полезно для согласованности кода, особенно если другие типы ассетов загружаются схожим образом.
// this.load.svg({ key: 'pencil', file: 'assets/svg/pencil.svg' });
// this.load.svg({ key: 'cartman', file: 'assets/svg/cartman.svg' });
В этом подходе ключ и путь к файлу указываются как свойства объекта. Функционально этот способ идентичен базовому, но структура данных явнее.
Оптимизация путей: setPath и загрузка массивом
Для случаев, когда множество файлов находится в одной папке, Phaser предлагает инструменты для избежания дублирования пути.
Сначала можно задать путь для конкретного типа загрузчика с помощью this.load.setPath().
// this.load.setPath('assets/svg');
После этого можно загружать файлы, указывая только их ключи. Более того, можно загрузить несколько файлов одним вызовом, передав массив объектов.
// this.load.svg([
// { key: 'pencil' },
// { key: 'cartman' },
// ]);
Это делает код чище, особенно когда количество векторных ассетов велико. Все пути будут автоматически разрешены относительно заданного в setPath.
Использование загруженных SVG в сцене
После того как ассеты загружены в preload(), Phaser автоматически переходит к методу create(). Здесь загруженные SVG используются так же, как и любые другие текстуры, с помощью this.add.image().
create ()
{
this.add.image(400, 300, 'fireflower');
this.add.image(400, 300, 'pencil');
this.add.image(150, 300, 'cartman');
}
Первые два аргумента — это координаты X и Y для размещения центра изображения. Третий аргумент — это ключ, под которым файл был зарегистрирован при загрузке. Важно отметить, что изображения добавляются в порядке вызова: последнее добавленное ('cartman') будет визуально поверх предыдущих, если их координаты перекрываются, как в случае с 'fireflower' и 'pencil'.
Настройка игры и конфигурация
Весь пример работает в рамках стандартной конфигурации Phaser. Объект config определяет основные параметры игры.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#efefef',
parent: 'phaser-example',
scene: Example
};
Здесь type: Phaser.AUTO позволяет движку самому выбрать WebGL или Canvas рендерер. width и height задают размеры игрового холста. backgroundColor устанавливает цвет фона. Свойство parent указывает ID HTML-элемента, в который будет встроен холст. Ключевой параметр scene принимает класс нашей сцены Example. Инициализация игры происходит созданием нового экземпляра Phaser.Game с этой конфигурацией.
Что попробовать дальше
Загрузка SVG в Phaser — процесс простой и гибкий. Вы можете использовать лаконичный синтаксис, объектный подход или мощные методы вроде setPath для загрузки пачек файлов. Поэкспериментируйте: попробуйте анимировать размер или цвет загруженных векторных изображений через Tween, используйте их в качестве текстур для частиц (this.add.particles) или комбинируйте с графическими примитивами Phaser для создания сложных динамических интерфейсов.
