О чем этот пример
Одной из сильных сторон Phaser является мощная система геометрии, позволяющая легко манипулировать формами. В этой статье мы разберем, как вращать линию в реальном времени, используя встроенные методы геометрического объекта `Phaser.Geom.Line`. Этот простой пример открывает путь к созданию сложных визуальных эффектов, вращающихся интерфейсных элементов или прицелов в играх, без необходимости вручную пересчитывать координаты. Понимание геометрических операций — ключ к оживлению статичных графических объектов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
line;
graphics;
create ()
{
this.graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xaa00aa } });
this.line = new Phaser.Geom.Line(200, 300, 600, 300);
}
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);
Создание базовой сцены и объектов
В классе сцены Example мы объявляем два свойства: line для хранения геометрического объекта и graphics для его визуализации.
В методе create() инициализируется графический контекст Graphics с заданным стилем линии и создается сама линия. Конструктор Phaser.Geom.Line принимает четыре аргумента: начальные координаты (x1, y1) и конечные координаты (x2, y2).
this.graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xaa00aa } });
this.line = new Phaser.Geom.Line(200, 300, 600, 300);
Изначально линия горизонтальна и расположена по центру экрана по вертикали. Графический объект graphics будет использоваться для отрисовки.
Вращение и отрисовка в реальном времени
Основная логика анимации находится в методе update(), который вызывается каждый кадр.
Сначала мы применяем статический метод Phaser.Geom.Line.Rotate к нашей линии. Первый аргумент — это сам объект линии, второй — угол поворота в радианах.
Phaser.Geom.Line.Rotate(this.line, 0.02);
Метод Rotate модифицирует исходный объект line, поворачивая его на 0.02 радиана вокруг его центральной точки.
Перед отрисовкой обновленной линии необходимо очистить графический буфер от старого кадра.
this.graphics.clear();
this.graphics.strokeLineShape(this.line);
Метод strokeLineShape принимает геометрический объект (в нашем случае линию) и рисует его в соответствии с установленным стилем линии.
Как работает вращение?
Метод Phaser.Geom.Line.Rotate(line, angle) вращает линию вокруг ее центральной точки. Центр вычисляется автоматически как среднее арифметическое начальной и конечной точек.
Важно понимать, что вращение накапливается. Поскольку метод update вызывается постоянно, каждые 0.02 радиана добавляются к текущему углу, создавая плавную непрерывную анимацию.
Исходные координаты линии (200, 300, 600, 300) после каждого вызова Rotate пересчитываются по формулам поворота точки относительно центра. Вся сложная математика инкапсулирована в одном вызове API.
Конфигурация игры и запуск
Пример завершается стандартной конфигурацией игры Phaser, которая задает размеры окна, тип рендерера и указывает нашу сцену Example.
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Ключевой параметр scene связывает игровой цикл с логикой нашего класса. После создания экземпляра Game автоматически запускаются методы create() и update() нашей сцены.
Что попробовать дальше
Вращение линии с помощью Phaser.Geom.Line.Rotate — это наглядный пример работы с геометрией в движении. Этот принцип применим к любым другим геометрическим примитивам, таким как прямоугольники (Phaser.Geom.Rectangle) или круги (Phaser.Geom.Circle).
**Идеи для экспериментов:**
1. Попробуйте вращать линию не вокруг центра, а вокруг одной из ее конечных точек. Для этого сначала переместите линию так, чтобы нужная точка оказалась в начале координат (0,0), выполните поворот, а затем верните ее на место.
2. Измените скорость вращения, заменив константу 0.02 на значение, зависящее от времени (this.time.now), чтобы создать эффект ускорения или замедления.
3. Добавьте интерактивность: привяжите угол поворота к положению курсора мыши, используя this.input.activePointer.x.
4. Создайте несколько линий, вращающихся с разной скоростью, для формирования сложного паттерна.
