О чем этот пример
При разработке игр часто возникает необходимость в точных геометрических расчётах: для генерации траекторий, расстановки объектов по кривой или создания сложных коллайдеров. Phaser предоставляет мощный, но простой в использовании геометрический модуль. В этой статье мы разберём, как с помощью метода `getPoints()` получить массив точек, равномерно распределённых по контуру эллипса. Этот приём открывает двери для создания орбит планет, круговых интерфейсов и плавных нелинейных перемещений.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
const graphics = this.add.graphics({ lineStyle: { width: 2, color: 0x00ff00 }, fillStyle: { color: 0xff0000 }});
const ellipse = new Phaser.Geom.Ellipse(400, 300, 600, 300);
const points = ellipse.getPoints(32);
for (let i = 0; i < points.length; i++)
{
const p = points[i];
graphics.fillRect(p.x - 4, p.y - 4, 8, 8);
}
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание геометрического примитива
Всё начинается с создания объекта эллипса. Класс Phaser.Geom.Ellipse принимает координаты центра и размеры по осям.
const ellipse = new Phaser.Geom.Ellipse(400, 300, 600, 300);
Здесь мы создаём эллипс с центром в точке (400, 300). Ширина (горизонтальный диаметр) равна 600 пикселям, а высота (вертикальный диаметр) — 300 пикселям. Этот объект пока существует только как математическое представление и не отрисовывается на экране.
Извлечение точек контура
Ключевой метод для работы — getPoints(quantity). Он вычисляет и возвращает массив точек (Phaser.Geom.Point), равномерно распределённых по периметру фигуры.
const points = ellipse.getPoints(32);
Аргумент 32 определяет количество точек, которые мы хотим получить. Чем больше число, тем выше точность аппроксимации контура, но и тем больше вычислительная нагрузка. Для плавного эллипса часто хватает 32-64 точек. В результате points становится массивом из 32 объектов, каждый со свойствами `xиy`.
Визуализация результата
Чтобы увидеть полученные точки, необходимо их нарисовать. В примере для отрисовки используется объект Graphics.
Сначала создаётся контекст рисования с заданными стилями линии и заливки.
const graphics = this.add.graphics({
lineStyle: { width: 2, color: 0x00ff00 },
fillStyle: { color: 0xff0000 }
});
Затем, в цикле, для каждой точки рисуется небольшой квадратик, центрированный на её координатах. Метод fillRect(x, y, width, height) рисует залитый прямоугольник.
for (let i = 0; i < points.length; i++)
{
const p = points[i];
graphics.fillRect(p.x - 4, p.y - 4, 8, 8);
}
Вычитание 4 из координат `xиy` нужно для центрирования квадрата размером 8x8 пикселей на самой точке. В итоге на экране мы увидим эллипс, «нарисованный» красными точками.
Практическое применение в играх
Полученный массив точек — это не просто визуализация. Это готовые данные для игровой логики.
* **Расстановка объектов:** Вы можете пройтись по массиву points и разместить на этих позициях спрайты врагов, элементов интерфейса или декораций, создав идеально ровное круговое построение.
points.forEach(point => {
this.add.sprite(point.x, point.y, 'element');
});
* **Движение по траектории:** Координаты точек можно использовать для задания пути следования объекта через Path или простой линейной интерполяции, заставив его двигаться по эллиптической орбите.
* **Сложные коллайдеры:** Если встроенных фигур коллайдера недостаточно, точки эллипса могут стать основой для создания полигонального коллайдера вручную, используя физический движок.
Что попробовать дальше
Метод getPoints() геометрических объектов Phaser — это мост между абстрактной математикой и игровой практикой. Он превращает фигуру в готовый набор координат для расстановки, движения и проверки столкновений. Попробуйте поэкспериментировать: измените количество точек, чтобы найти баланс между плавностью и производительностью; используйте полученные точки для создания «пояса астероидов» вокруг планеты или для реализации циклического меню выбора заклинаний.
