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

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

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

Живой запуск

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

Исходный код


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

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

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

        this.input.on('pointermove', pointer =>
        {

            Phaser.Geom.Line.CenterOn(this.line, pointer.x, pointer.y);

        });
    }

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

        this.graphics.clear();

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

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

const game = new Phaser.Game(config);

Инициализация сцены и объектов

Создадим базовую структуру сцены, где graphics отвечает за отрисовку, а line — геометрический объект, который мы будем вращать.

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

    create () {
        this.graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xaa00aa } });
        this.line = new Phaser.Geom.Line(300, 300, 400, 300);
    }
}

Здесь this.add.graphics создаёт холст для рисования с заданным стилем линии. Phaser.Geom.Line определяет отрезок по начальной (300, 300) и конечной (400, 300) точкам — изначально это горизонтальная линия.

Центрирование линии по курсору мыши

Добавим интерактивности: линия будет следовать за указателем, сохраняя свою форму и ориентацию.

this.input.on('pointermove', pointer => {
    Phaser.Geom.Line.CenterOn(this.line, pointer.x, pointer.y);
});

Метод CenterOn перемещает линию так, чтобы её центр совпадал с координатами курсора. Это не изменяет длину или угол линии, а только её позицию на сцене. Обратите внимание: мы передаём сам объект this.line первым аргументом — метод модифицирует его напрямую.

Вращение и отрисовка линии

В методе update, который вызывается каждый кадр, мы вращаем линию и перерисовываем её.

update () {
    Phaser.Geom.Line.Rotate(this.line, 0.02);
    this.graphics.clear();
    this.graphics.strokeLineShape(this.line);
}

Rotate поворачивает линию на 0.02 радиана вокруг её центра (который теперь следует за курсором). Поскольку update выполняется постоянно, линия плавно вращается. clear стирает предыдущий кадр, а strokeLineShape рисует обновлённую линию с заданным стилем.

Конфигурация и запуск игры

Стандартная настройка Phaser Game для запуска примера.

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

const game = new Phaser.Game(config);

Здесь определяется размер холста (800x600), графический рендерер (AUTO выбирает WebGL или Canvas) и корневая сцена Example.

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

Вы научились манипулировать геометрическим объектом Line: центрировать его по точке и вращать. Попробуйте изменить скорость вращения, длину линии или привязать её не к курсору, а к спрайту. Это можно использовать для создания прицела, вращающегося щита или индикатора направления ветра.