О чем этот пример
При разработке игр часто требуется манипулировать геометрическими объектами. Понимание того, как получать и визуализировать ключевые точки отрезка, — это основа для создания траекторий, прицелов, линий-индикаторов и сложных геометрических построений. В этой статье мы разберем практический пример вращения отрезка и отрисовки его конечных точек, используя методы `getPointA()` и `getPointB()` из API Phaser.Geom.Line.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
graphics;
line;
create ()
{
this.graphics = this.add.graphics({ lineStyle: { width: 2, color: 0xaa00aa } });
this.line = new Phaser.Geom.Line(250, 300, 550, 300);
}
update ()
{
Phaser.Geom.Line.Rotate(this.line, 0.02);
this.graphics.clear();
this.graphics.strokeLineShape(this.line);
this.graphics.fillStyle(0xaa0000);
this.graphics.fillPointShape(this.line.getPointA(), 10);
this.graphics.fillStyle(0x0000aa);
this.graphics.fillPointShape(this.line.getPointB(), 10);
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Инициализация сцены и создание объектов
В начале кода мы создаем класс сцены, наследующий от Phaser.Scene. В нем объявляются два свойства: graphics для рисования и line для хранения геометрического объекта.
В методе create() происходит первоначальная настройка:
this.graphics = this.add.graphics({ lineStyle: { width: 2, color: 0xaa00aa } });
this.line = new Phaser.Geom.Line(250, 300, 550, 300);
Здесь создается объект Graphics с фиолетовым стилем линии толщиной 2 пикселя. Затем инициализируется отрезок line с начальной точкой A в координатах (250, 300) и конечной точкой B в (550, 300). Этот отрезок будет горизонтальным и расположенным по центру экрана по вертикали.
Анимация и получение точек отрезка
Основная логика анимации находится в методе update(), который вызывается на каждом кадре.
Первым делом отрезок вращается вокруг своего центра:
Phaser.Geom.Line.Rotate(this.line, 0.02);
Статический метод Phaser.Geom.Line.Rotate() поворачивает отрезок this.line на 0.02 радиана за кадр. После этого необходимо очистить холст для рисования и отрисовать обновленную геометрию:
this.graphics.clear();
this.graphics.strokeLineShape(this.line);
Теперь ключевой момент: чтобы визуализировать концы отрезка, мы используем методы getPointA() и getPointB(). Эти методы возвращают объекты Phaser.Geom.Point, содержащие текущие координаты соответствующих концов отрезка после всех трансформаций (в данном случае — вращения).
this.graphics.fillStyle(0xaa0000);
this.graphics.fillPointShape(this.line.getPointA(), 10);
this.graphics.fillStyle(0x0000aa);
this.graphics.fillPointShape(this.line.getPointB(), 10);
Сначала устанавливается красный цвет заливки, и методом fillPointShape() рисуется точка A радиусом 10 пикселей. Затем цвет меняется на синий, и аналогичным образом рисуется точка B. Важно, что мы не храним точки отдельно — методы getPointA и getPointB всегда возвращают актуальные координаты, что очень удобно для динамических расчетов.
Конфигурация и запуск игры
Финальная часть кода — стандартная конфигурация игры Phaser и ее инстанцирование.
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Конфиг задает окно игры размером 800x600 пикселей, автоматический выбор рендерера (WebGL или Canvas) и указывает нашу сцену Example в качестве стартовой. Создание экземпляра Phaser.Game с этим конфигом запускает игровой цикл.
Что попробовать дальше
Методы getPointA() и getPointB() — это простые, но мощные инструменты для работы с отрезками в Phaser. Они позволяют легко получать доступ к концам линии после любых трансформаций, что открывает множество возможностей для геймдизайна. Попробуйте поэкспериментировать: привязать к точкам спрайты (например, маркеры или части оружия), реализовать движение объекта между точками A и B по отрезку или создать систему прицеливания, где линия — это траектория полета снаряда, а точки — начальная и расчетная позиции.
