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

Создание интерфейсов, меню или сложных композиций из спрайтов часто требует их точного размещения друг относительно друга или внутри заданной области. Ручной расчёт координат отнимает время и усложняет поддержку кода. Встроенный модуль `Phaser.Display.Align` предоставляет готовые методы для решения этой задачи. Эта статья покажет, как использовать `Align.In` для выравнивания игровых объектов. Вы научитесь центрировать картинку на экране и привязывать один спрайт к краю другого, что особенно полезно для создания HUD, кнопок с иконками или сложных фонов.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('pic', 'assets/pics/barbarian-loading.png');
        this.load.image('block', 'assets/sprites/block.png');
    }

    create ()
    {
        const pic = this.add.image(0, 0, 'pic');
        const block = this.add.image(0, 0, 'block');

        //  Center the picture in the game
        Phaser.Display.Align.In.Center(pic, this.add.zone(400, 300, 800, 600));

        //  Center the sprite to the picture
        Phaser.Display.Align.In.TopCenter(block, pic);
    }
}

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

const game = new Phaser.Game(config);

Загрузка ресурсов и создание сцены

Всё начинается с базовой настройки сцены. В методе preload мы загружаем два изображения, которые будем использовать для демонстрации. Обратите внимание на использование setBaseURL — это удобный способ задать общий путь для всех загружаемых файлов.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('pic', 'assets/pics/barbarian-loading.png');
    this.load.image('block', 'assets/sprites/block.png');
}

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

create ()
{
    const pic = this.add.image(0, 0, 'pic');
    const block = this.add.image(0, 0, 'block');
    // ... выравнивание будет здесь
}

Центрирование объекта в зоне

Первый ключевой шаг — размещение фоновой картинки (pic) по центру игрового окна. Для этого используется метод Phaser.Display.Align.In.Center. Он принимает два аргумента: объект для выравнивания и целевой прямоугольник.

В качестве цели мы создаём зону (Zone) размером 800x600 пикселей, центрованную в точке (400, 300). Зона — это невидимый игровой объект, идеально подходящий для задания областей размещения.

//  Center the picture in the game
Phaser.Display.Align.In.Center(pic, this.add.zone(400, 300, 800, 600));

После выполнения этого кода центр изображения pic совпадёт с центром зоны. Это стандартный приём для центрирования фона или основного элемента интерфейса на экране.

Выравнивание одного объекта относительно другого

Второй распространённый сценарий — позиционирование одного спрайта относительно другого. Мы хотим, чтобы спрайт block находился по центру верхнего края картинки pic. Для этого предназначен метод Phaser.Display.Align.In.TopCenter.

//  Center the sprite to the picture
Phaser.Display.Align.In.TopCenter(block, pic);

Метод автоматически рассчитает координаты так, чтобы нижний центр спрайта block совпал с верхним центром картинки pic. В модуле Align.In есть и другие методы, например TopLeft, RightCenter или BottomRight, которые позволяют привязать объект к любому краю или углу другого объекта.

Полная конфигурация игры

Для полноты картины приведём конфигурационный объект игры. Важно, что в нём заданы размеры окна (800x600), которые соответствуют размерам зоны, созданной для центрирования. Это гарантирует, что фоновая картинка окажется ровно по центру экрана.

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

const game = new Phaser.Game(config);

Если изменить width и height в конфиге, но не обновить параметры зоны, то выравнивание фона станет некорректным. Зону следует создавать, опираясь на актуальные размеры игровой области.

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

Модуль Phaser.Display.Align — это мощный и простой инструмент для компоновки игровых объектов. Он избавляет от рутинных математических расчётов и делает код чище. Для экспериментов попробуйте изменить метод выравнивания для спрайта block на BottomRight или LeftCenter. Также можно создать несколько зон разного размера и выравнивать в них различные группы объектов для построения сложных макетов экрана.