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

Создание равномерно распределённых точек по контуру фигуры — частая задача в игровой разработке. Например, для расстановки врагов по кругу, создания круговых UI-элементов или визуальных эффектов. Метод `getPoints()` геометрического объекта `Circle` решает эту задачу одной строкой кода. В этой статье мы разберём, как его использовать для получения координат и визуализации точек на окружности.

Версия 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 circle = new Phaser.Geom.Circle(400, 300, 170);

        const points = circle.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);

Создание геометрического объекта Circle

Первый шаг — создать объект окружности. В Phaser для этого используется класс Phaser.Geom.Circle. Его конструктор принимает три основных параметра: координаты центра по осям X и Y и радиус.

const circle = new Phaser.Geom.Circle(400, 300, 170);

В этом примере создаётся окружность с центром в точке (400, 300) и радиусом 170 пикселей. Эти координаты отсчитываются от верхнего левого угла игрового холста. Такой объект является чисто математическим описанием фигуры и сам по себе не отрисовывается на экране.

Получение массива точек методом getPoints

Ключевой метод для нашей задачи — getPoints(quantity). Он вызывается у экземпляра Phaser.Geom.Circle и возвращает массив объектов Phaser.Geom.Point. Каждая точка содержит свойства `xиy`.

const points = circle.getPoints(32);

Аргумент quantity определяет, сколько точек нужно получить. Метод равномерно распределяет указанное количество точек по окружности. В примере мы запрашиваем 32 точки. Важно понимать, что точки располагаются именно на контуре (границе) окружности, а не внутри неё.

Визуализация полученных точек

Чтобы увидеть результат, необходимо отрисовать каждую точку. Для графики в Phaser используется объект 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);
}

Код p.x - 4, p.y - 4 смещает координаты так, чтобы точка (которая считается центром нашего квадрата) оказалась в центре нарисованного прямоугольника размером 8x8 пикселей. В итоге на экране мы увидим 32 красных квадрата, образующих круг.

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

Метод Phaser.Geom.Circle.getPoints() — это мощный и простой инструмент для получения координат на окружности. Попробуйте изменить количество точек в вызове метода — вы увидите, как меняется плотность их распределения. Это можно применить для создания планетарных орбит, точек появления врагов в круговой арене или для построения сложных фигур на основе окружности. По аналогии можно исследовать методы getPoints у других геометрических объектов, например, Phaser.Geom.Rectangle.