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

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

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    lines;
    line;
    graphics;

    create ()
    {
        this.graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xaa00aa, alpha: 0.6 } });

        this.line = new Phaser.Geom.Line(100, 300, 400, 300);

        this.lines = [];
    }

    update ()
    {
        Phaser.Geom.Line.Rotate(this.line, 0.03);

        this.lines.push(Phaser.Geom.Line.Clone(this.line));

        this.graphics.clear();

        this.graphics.strokeLineShape(this.line);

        for (let i = 0; i < this.lines.length; i++)
        {
            Phaser.Geom.Line.Offset(this.lines[i], 3, 0);

            if (this.lines[i].left > 800)
            {
                this.lines.splice(i--, 1);
            }
            else
            {
                this.graphics.strokeLineShape(this.lines[i]);
            }

        }

    }
}

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

const game = new Phaser.Game(config);

Подготовка сцены и создание базовой линии

В методе create() инициализируются основные объекты. Сначала создаётся объект Graphics для отрисовки линий с заданным стилем. Затем создаётся исходный объект линии Phaser.Geom.Line с начальными координатами. Также инициализируется пустой массив lines, который будет хранить клоны.

this.graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xaa00aa, alpha: 0.6 } });
this.line = new Phaser.Geom.Line(100, 300, 400, 300);
this.lines = [];

Анимация исходной линии

В методе update(), который выполняется каждый кадр, исходная линия this.line вращается вокруг своей центральной точки. Для этого используется статический метод Phaser.Geom.Line.Rotate(). Первый аргумент — изменяемая линия, второй — угол вращения в радианах.

Phaser.Geom.Line.Rotate(this.line, 0.03);

Клонирование линии и управление следом

Каждый кадр текущее состояние вращающейся линии клонируется. Метод Phaser.Geom.Line.Clone() создаёт и возвращает новый независимый объект линии с теми же координатами, что и исходный. Этот клон помещается в массив this.lines, формируя историю перемещений.

this.lines.push(Phaser.Geom.Line.Clone(this.line));

Перед отрисовкой кадра холст Graphics очищается методом clear(), а затем на него снова рисуется текущая, уже повёрнутая, исходная линия с помощью strokeLineShape().

this.graphics.clear();
this.graphics.strokeLineShape(this.line);

Анимация следа из клонов

Далее в цикле обрабатываются все клоны, хранящиеся в массиве. Каждый клон смещается вправо по оси X с помощью метода Phaser.Geom.Line.Offset(). Это изменяет координаты самой линии, хранящейся в массиве.

Phaser.Geom.Line.Offset(this.lines[i], 3, 0);

После смещения проверяется условие: если левый край линии (left) ушёл за правую границу экрана (координата 800), эта линия удаляется из массива с помощью splice. В противном случае клон отрисовывается на холсте. Таким образом, след из линий плавно движется вправо и исчезает.

if (this.lines[i].left > 800)
{
    this.lines.splice(i--, 1);
}
else
{
    this.graphics.strokeLineShape(this.lines[i]);
}

Настройка и запуск игры

Конфигурационный объект config задаёт основные параметры игры: размеры холста, автоматический выбор WebGL/Canvas, элемент-контейнер и класс основной сцены. Экземпляр игры создаётся с этой конфигурацией.

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

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

Пример наглядно показывает работу с геометрией в Phaser: создание, клонирование, трансформация и отрисовка примитивов. Для экспериментов попробуйте изменить угол вращения, скорость смещения клонов (Offset), цвет или прозрачность в lineStyle. Можно заставить клоны смещаться не только по X, но и по Y, менять их цвет со временем или создавать клон не каждый кадр, а, например, каждые 100 миллисекунд, чтобы получить пунктирный след.