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

Любой спрайт или изображение в Phaser имеет невидимую точку привязки (origin), которая определяет, как объект позиционируется на сцене и вращается вокруг своей оси. Понимание работы `setOrigin()` критически важно для точного выравнивания игровых элементов, создания анимаций и реализации физических взаимодействий. Эта статья на практическом примере разбирает, как меняется положение спрайта при изменении точки привязки. Вы научитесь контролировать положение объектов относительно их координат и предсказуемо управлять их трансформациями.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('ball', 'assets/sprites/shinyball.png');
    }

    create ()
    {
        //  Graphics background with lines on

        const graphics = this.add.graphics();

        this.add.image(200, 100, 'ball').setOrigin(0, 0);
        this.add.image(400, 100, 'ball').setOrigin(0, 0.5);
        this.add.image(600, 100, 'ball').setOrigin(0, 1);

        this.add.image(200, 200, 'ball').setOrigin(0, 0);
        this.add.image(400, 200, 'ball').setOrigin(0.5, 0);
        this.add.image(600, 200, 'ball').setOrigin(1, 0);

        this.add.image(200, 300, 'ball').setOrigin(0, 0);
        this.add.image(400, 300, 'ball').setOrigin(0.5, 0.5);
        this.add.image(600, 300, 'ball').setOrigin(1, 1);

        this.add.image(200, 400, 'ball').setOrigin(1, 0);
        this.add.image(400, 400, 'ball').setOrigin(1, 0.25);
        this.add.image(600, 400, 'ball').setOrigin(1, 0.5);

        this.add.image(200, 500, 'ball').setOrigin(0.25, 1);
        this.add.image(400, 500, 'ball').setOrigin(0.5, 0.25);
        this.add.image(600, 500, 'ball').setOrigin(0.75, 0.5);

        //  Draw the alignment lines to our Graphics object

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

        graphics.beginPath();

        //  Vertical lines

        graphics.moveTo(200, 0);
        graphics.lineTo(200, 600);

        graphics.moveTo(400, 0);
        graphics.lineTo(400, 600);

        graphics.moveTo(600, 0);
        graphics.lineTo(600, 600);

        //  Horizontal lines

        graphics.moveTo(0, 100);
        graphics.lineTo(800, 100);

        graphics.moveTo(0, 200);
        graphics.lineTo(800, 200);

        graphics.moveTo(0, 300);
        graphics.lineTo(800, 300);

        graphics.moveTo(0, 400);
        graphics.lineTo(800, 400);

        graphics.moveTo(0, 500);
        graphics.lineTo(800, 500);

        graphics.strokePath();

        graphics.closePath();
    }
}

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

const game = new Phaser.Game(config);

Что такое точка привязки (origin)?

Точка привязки — это внутренняя точка внутри спрайта, к которой «привязываются» его координаты (x, y) на сцене. По умолчанию в Phaser эта точка находится в центре объекта (значение 0.5, 0.5). Это значит, что когда вы задаете спрайту координаты (400, 300), именно его центр будет расположен в этой позиции.

Значения setOrigin() задаются в нормализованных координатах: - (0, 0) — левый верхний угол. - (1, 1) — правый нижний угол. - (0.5, 0.5) — центр.

this.add.image(400, 300, 'ball').setOrigin(0.5, 0.5);

Создание сетки для визуализации

Прежде чем расставлять спрайты, пример создает графический объект для отрисовки сетки. Это помогает увидеть, как координаты (x, y) каждого изображения соотносятся с его точкой привязки.

Объект Graphics создается для отрисовки линий. Метод lineStyle задает толщину, цвет и прозрачность линии. Далее с помощью moveTo и lineTo определяются начальная и конечная точки каждого отрезка.

const graphics = this.add.graphics();
graphics.lineStyle(1, 0x00ff00, 1);
graphics.beginPath();
graphics.moveTo(200, 0);
graphics.lineTo(200, 600);
// ... другие линии
graphics.strokePath();
graphics.closePath();

Эксперименты с выравниванием по горизонтали

Первый ряд спрайтов демонстрирует изменение горизонтальной составляющей точки привязки (originX) при фиксированной вертикальной (originY). Координата `yу всех спрайтов одинакова (100), аx` — разная (200, 400, 600).

Обратите внимание: спрайт «привязывается» к линии сетки именно своей точкой origin. Например, при setOrigin(0, 0.5) левый край спрайта выравнивается по вертикальной линии x=200, а его центр — по горизонтальной линии y=100.

this.add.image(200, 100, 'ball').setOrigin(0, 0);
this.add.image(400, 100, 'ball').setOrigin(0, 0.5);
this.add.image(600, 100, 'ball').setOrigin(0, 1);

Эксперименты с выравниванием по вертикали

Второй ряд показывает обратную ситуацию: фиксируется горизонтальная составляющая (originX), а меняется вертикальная (originY). Здесь координата `xу всех спрайтов разная, аy` — одинаковая (200).

Спрайт с setOrigin(0.5, 0) будет выровнен так, что его верхний край окажется на линии y=200, а центр по горизонтали — на линии сетки, заданной координатой `x`.

this.add.image(200, 200, 'ball').setOrigin(0, 0);
this.add.image(400, 200, 'ball').setOrigin(0.5, 0);
this.add.image(600, 200, 'ball').setOrigin(1, 0);

Стандартные и произвольные точки привязки

Далее пример показывает как классические комбинации (углы, центр), так и произвольные дробные значения. Значения origin могут быть любыми числами, в том числе отрицательными или больше 1, что позволяет «привязывать» точку за пределами видимой области спрайта.

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

// Классические точки
this.add.image(200, 300, 'ball').setOrigin(0, 0);
this.add.image(400, 300, 'ball').setOrigin(0.5, 0.5);
this.add.image(600, 300, 'ball').setOrigin(1, 1);

// Произвольные точки
this.add.image(200, 500, 'ball').setOrigin(0.25, 1);
this.add.image(400, 500, 'ball').setOrigin(0.5, 0.25);
this.add.image(600, 500, 'ball').setOrigin(0.75, 0.5);

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

Точка привязки — фундаментальное свойство любого игрового объекта в Phaser. Умелое управление origin позволяет точно позиционировать UI-элементы, задавать правильные центры вращения для анимаций и корректно обрабатывать столкновения в физическом движке. Для экспериментов попробуйте: 1. Создать спрайт и анимировать его вращение, меняя origin от (0,0) до (1,1). 2. Построить интерфейс с панелями, которые должны выравниваться по разным краям экрана. 3. Реализовать «маятник», закрепив точку привязки спрайта выше его видимой части.