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

Визуализация — ключевая часть любой игры. Создание сложных ассетов требует времени и навыков художника, но что, если вам нужно быстро отрисовать хитбокс, область патруля или временный эффект? На помощь приходит Graphics API от Phaser. Эта статья покажет, как с помощью всего нескольких строк кода создавать базовые фигуры прямо во время выполнения игры, что незаменимо для прототипирования, отладки и создания динамических визуальных элементов.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const graphics = this.add.graphics();

        graphics.lineStyle(4, 0x00ff00, 1);

        graphics.strokeRect(32, 32, 256, 256);

        graphics.fillStyle(0xff0000, 0.8);

        graphics.fillCircle(260, 260, 120);

        graphics.lineStyle(4, 0xff00ff, 1);

        graphics.strokeEllipse(400, 300, 200, 128);

        // graphics.setAlpha(0.5);
    }
}

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

const game = new Phaser.Game(config);

Создание холста для рисования

Перед тем как рисовать, нужен «холст». В Phaser этим холстом является объект Graphics. Он создается через фабрику this.add.graphics() и становится полноценным игровым объектом, который можно позиционировать, вращать и анимировать.

const graphics = this.add.graphics();

После создания объект graphics готов к приему команд для рисования. Его можно добавить в любую часть сцены, и он будет отрисовываться поверх других объектов, если не задана иная глубина.

Настройка стилей: контур и заливка

Рисование происходит в два этапа: сначала настраивается стиль, затем вызывается команда для отрисовки фигуры. Стили для контура и заливки задаются отдельно.

Метод lineStyle определяет, как будет выглядеть обводка фигуры. Его параметры: толщина линии, цвет в формате HEX и альфа-канал (прозрачность).

graphics.lineStyle(4, 0x00ff00, 1);

Метод fillStyle работает аналогично, но для заливки внутренней области фигуры.

graphics.fillStyle(0xff0000, 0.8);

Важно: установленный стиль действует для всех последующих команд рисования, пока не будет изменен новым вызовом lineStyle или fillStyle.

Рисование фигур: от прямоугольников до эллипсов

После настройки стилей можно вызывать команды для отрисовки конкретных примитивов. Phaser предоставляет методы для самых распространенных фигур.

Метод strokeRect рисует только контур прямоугольника. Его аргументы: X и Y координаты верхнего левого угла, ширина и высота.

graphics.strokeRect(32, 32, 256, 256);

Метод fillCircle заливает сплошным цветом круг. Аргументы: X и Y координаты центра круга и его радиус.

graphics.fillCircle(260, 260, 120);

Для более сложных форм, например, эллипса, используется strokeEllipse. Его аргументы: X и Y координаты центра, ширина по горизонтали и высота по вертикали.

graphics.lineStyle(4, 0xff00ff, 1);
graphics.strokeEllipse(400, 300, 200, 128);

Обратите внимание, как перед рисованием эллипса мы снова вызвали lineStyle, чтобы изменить цвет контура с зеленого на пурпурный.

Управление видимостью и практическое применение

Объект Graphics наследует все свойства GameObject. Это значит, с ним можно работать так же, как со спрайтом. Например, изменить его общую прозрачность.

// graphics.setAlpha(0.5);

Раскомментировав эту строку, вы сделаете всю нарисованную графику полупрозрачной. Это крайне полезно на практике: 1. **Отладка:** Визуализация невидимых зон (область поражения оружия, триггеры событий, путь ИИ). 2. **Прототипирование:** Быстрая «набросочная» графика для проверки геймплея. 3. **Динамические эффекты:** Создание вспышек, щитов, областей заклинаний, которые меняют форму и размер во время игры.

Поскольку объект живой, вы можете в любой момент очистить холст методом graphics.clear() и перерисовать фигуры с новыми параметрами в update()-цикле.

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

Graphics API в Phaser — это мощный и легкий инструмент для программной генерации графики. Освоив рисование примитивов, вы сможете не только быстрее отлаживать проекты, но и создавать уникальные динамические визуальные эффекты, не зависящие от загрузки текстур. Для экспериментов попробуйте анимировать радиус круга, чтобы создать волну, или изменять координаты вершин многоугольника в реальном времени, рисуя его заново каждый кадр.