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

Векторная графика (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 для создания сложных динамических интерфейсов.