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

Точное позиционирование объектов — основа аккуратной игровой графики. В этом примере мы разберем, как использовать методы класса `Phaser.Geom.Circle` для установки и изменения положения круга на сцене. Вы научитесь управлять не только центром фигуры, но и ее границами, что критически важно для выравнивания, столкновений и анимаций.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const circle = new Phaser.Geom.Circle(0, 0, 75);

        circle.setPosition(400, 200);

        const graphics = this.add.graphics({ lineStyle: { color: 0xff0000 } });
        graphics.strokeCircleShape(circle);

        // move right by radius
        circle.x += circle.radius;

        graphics.lineStyle(1, 0x00ff00);
        graphics.strokeCircleShape(circle);

        // place top-right corner to bottom-left of its previous position
        circle.right = circle.left;
        circle.top = circle.bottom;

        graphics.lineStyle(1, 0x0000ff);
        graphics.strokeCircleShape(circle);
    }
}

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

const game = new Phaser.Game(config);

Создание круга и установка позиции

В начале примера мы создаем геометрический объект круга. Изначально его центр помещается в точку (0, 0), а затем с помощью метода setPosition перемещается.

const circle = new Phaser.Geom.Circle(0, 0, 75);
circle.setPosition(400, 200);

Метод setPosition(x, y) перемещает центр круга в указанные координаты. Это базовый способ задания позиции. После этого круг отрисовывается красным контуром с помощью графики (graphics.strokeCircleShape).

Изменение позиции через свойства центра

Прямое изменение свойств `xиy` объекта круга позволяет смещать его центр. Это простой способ для инкрементного перемещения, например, в игровом цикле.

circle.x += circle.radius;

В данном коде круг сдвигается вправо на величину своего радиуса. После этого он отрисовывается зеленым контуром. Обратите внимание, что мы изменяем свойство напрямую, а не используем метод.

Точное позиционирование по границам

Наиболее мощная часть примера — использование свойств границ: right, left, top и bottom. Установка этих свойств автоматически пересчитывает положение центра круга.

circle.right = circle.left;
circle.top = circle.bottom;

Здесь мы устанавливаем правую границу круга равной его предыдущей левой границе, а верхнюю границу — равной предыдущей нижней. Фактически, это перемещает круг так, чтобы его левый верхний угол (если представить описанный квадрат) оказался в точке, где ранее был правый нижний угол. Результат отрисовывается синим контуром.

Практическое применение и вывод

Эти техники незаменимы для: 1. **Выравнивания объектов** относительно друг друга или краев экрана. 2. **Обработки столкновений**, где нужно проверять границы фигур. 3. **Создания анимаций** с точным контролем над траекторией.

Главное преимущество — возможность работать как с центром (`x,y`), так и с границами, выбирая наиболее удобный для задачи способ.

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

Класс Phaser.Geom.Circle предоставляет гибкий набор инструментов для управления положением. Попробуйте экспериментировать: анимируйте движение круга, изменяя circle.x в update, или создайте композицию из нескольких фигур, выравнивая их через свойства right и bottom. Для сложной геометрии изучите другие классы, например, Phaser.Geom.Rectangle.