В библиотеке Phaser слои (Layer) используются для управления порядком отрисовки объектов на сцене. Каждый слой является контейнером для игровых объектов, который позволяет группировать элементы и контролировать их визуальное отображение относительно других слоев. Основной принцип работы с слоями — объекты внутри одного слоя отрисовываются в том порядке, в котором они были добавлены, а слои сами имеют свой собственный порядок на сцене.
const layer = this.add.layer();
После создания слоя в него можно добавлять игровые объекты:
layer.add(sprite);
layer.add(text);
Порядок отрисовки определяется двумя уровнями:
Для изменения порядка слоя используется метод moveAbove
и moveBelow:
layer1.moveAbove(layer2); // layer1 будет поверх layer2
layer2.moveBelow(layer3); // layer2 будет под layer3
Также можно использовать прямое управление индексом:
this.children.moveTo(layer, index);
Layer в Phaser является контейнером, поэтому можно комбинировать его с Container для сложных структур. Основное различие: контейнер управляет локальной трансформацией своих объектов (позиция, масштаб, вращение), а Layer служит исключительно для визуального порядка и упрощает сортировку объектов на сцене.
const container = this.add.container(0, 0);
container.add(sprite);
layer.add(container);
Для перестановки объектов внутри одного слоя используются методы:
layer.bringToTop(gameObject) — перемещает объект на
верхний уровень слоя.layer.sendToBack(gameObject) — перемещает объект на
задний план слоя.layer.moveUp(gameObject) /
layer.moveDown(gameObject) — перемещают объект на одну
позицию вверх или вниз внутри слоя.layer.bringToTop(sprite);
layer.sendToBack(text);
Это позволяет динамически управлять видимостью объектов при изменении состояния игры, например, для подсветки активного персонажа или отображения всплывающих элементов.
С помощью слоев удобно применять общие эффекты ко всем объектам одновременно:
layer.setAlpha(0.5);
layer.setVisible(false);
const maskShape = this.add.rectangle(0, 0, 200, 200, 0xffffff);
layer.setMask(maskShape.createGeometryMask());
Эти операции сразу влияют на все объекты слоя, что упрощает создание сложных визуальных эффектов без необходимости редактировать каждый объект отдельно.
Практическая рекомендация — разделять игровой мир и пользовательский интерфейс на разные слои:
const gameLayer = this.add.layer();
const uiLayer = this.add.layer();
gameLayer.add(player);
gameLayer.add(enemy);
uiLayer.add(scoreText);
uiLayer.add(healthBar);
uiLayer.moveAbove(gameLayer);
Такое разделение упрощает контроль над порядком отрисовки и обеспечивает независимое управление элементами интерфейса.
Использование слоев помогает оптимизировать сцену:
setVisible(false)) исключает
его объекты из отрисовки.const backgroundLayer = this.add.layer();
const mainLayer = this.add.layer();
const uiLayer = this.add.layer();
const bg = this.add.image(400, 300, 'background');
const player = this.add.sprite(400, 300, 'player');
const enemy = this.add.sprite(500, 300, 'enemy');
const score = this.add.text(10, 10, 'Score: 0', { fontSize: '32px', color: '#fff' });
backgroundLayer.add(bg);
mainLayer.add(player);
mainLayer.add(enemy);
uiLayer.add(score);
uiLayer.moveAbove(mainLayer);
В этом примере слой uiLayer всегда отображается поверх
игрового мира, а backgroundLayer — на заднем плане. Любые
изменения порядка объектов или слоев легко реализуются с помощью методов
Layer, обеспечивая чистую и управляемую структуру сцены.
Слои в Phaser позволяют строить иерархию объектов, управлять визуальным порядком и создавать комплексные сцены с минимальной сложностью кода. Они являются ключевым инструментом для организации графики в динамических играх.