О чем этот пример
При создании интерфейсов, меню или сложных композиций из спрайтов ручной расчёт координат каждого элемента становится утомительным и подверженным ошибкам. Phaser предоставляет мощный набор методов для выравнивания объектов относительно друг друга или зон на сцене. Это не только ускоряет вёрстку, но и делает код более читаемым и адаптивным к изменениям размеров.
Версия 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.LeftCenter(block, pic);
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Зачем нужен Display.Align?
Класс Phaser.Display.Align содержит статические методы для точного позиционирования игровых объектов. Вместо того чтобы вручную задавать координаты X и Y, вы указываете два объекта и тип выравнивания между ними. Это особенно полезно для центрирования картинок на экране, размещения кнопок в интерфейсе или создания сеток.
Основная работа ведётся через вложенный объект Phaser.Display.Align.In, который отвечает за выравнивание одного объекта *внутри* границ другого.
Создание зоны для выравнивания
Часто нужно выровнять объект не относительно другого спрайта, а относительно области на экране. Для этого используется this.add.zone(). Зона — это невидимый прямоугольник с заданными координатами и размерами.
В нашем примере мы создаём зону, совпадающую по размеру с игровым полем (800x600), и центрируем её на экране (координаты 400, 300 — это середина области 800x600).
// Создаём невидимую прямоугольную зону размером 800x600 в центре сцены
const gameZone = this.add.zone(400, 300, 800, 600);
Центрирование картинки на экране
Метод Phaser.Display.Align.In.Center принимает два аргумента: объект, который нужно выровнять, и объект, относительно которого происходит выравнивание. После вызова метода система координат первого объекта меняется так, что его центр совпадает с центром второго объекта.
Здесь мы центрируем загруженное изображение pic внутри созданной ранее зоны gameZone. Визуально это поместит картинку ровно по центру игрового окна.
// Центрируем картинку 'pic' внутри зоны gameZone
Phaser.Display.Align.In.Center(pic, gameZone);
Выравнивание спрайта относительно картинки
Следующий шаг — позиционирование одного спрайта относительно другого. Метод Phaser.Display.Align.In.LeftCenter выравнивает первый объект по левому краю второго, одновременно центрируя его по вертикали.
В примере спрайт block (маленький квадрат) привязывается к левому краю уже отцентрированной картинки pic. Его вертикальная позиция будет равна центру картинки по оси Y.
// Выравниваем спрайт 'block' по левому краю картинки 'pic' с центрированием по вертикали
Phaser.Display.Align.In.LeftCenter(block, pic);
Другие методы выравнивания
Phaser.Display.Align.In предлагает множество вариантов, покрывающих практически все потребности в вёрстке:
- TopLeft, TopCenter, TopRight — выравнивание по верхнему краю.
- LeftCenter, Center, RightCenter — выравнивание по центру с смещением по горизонтали.
- BottomLeft, BottomCenter, BottomRight — выравнивание по нижнему краю.
Каждый метод работает по одному принципу: первый аргумент — целевой объект, второй — объект-контейнер или репер.
Что попробовать дальше
Использование Phaser.Display.Align делает код позиционирования чистым, выразительным и независимым от конкретных числовых значений. Для экспериментов попробуйте:
1. Создать сетку из спрайтов, выравнивая их последовательно с разными методами.
2. Динамически менять размер зоны и наблюдать, как объекты автоматически перестраиваются.
3. Комбинировать выравнивание с анимацией для плавного перемещения UI-элементов.
