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

При разработке игр часто возникает необходимость управлять порядком отрисовки сцен. Например, вы хотите, чтобы фоновый слой внезапно стал передним планом для драматического эффекта. Phaser 3 предоставляет для этого простой, но мощный метод `swapPosition`. В этой статье мы разберем, как работает этот метод на практическом примере, и объясним, почему это полезно для управления визуальной иерархией в вашей игре.

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

Живой запуск

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

Исходный код


class Background extends Phaser.Scene
{
    constructor ()
    {
        super({ key: 'background', active: true });
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('face', 'assets/pics/bw-face.png');
    }

    create ()
    {
        this.face = this.add.image(-10, 300, 'face');
    }
}

class Demo extends Phaser.Scene
{
    constructor ()
    {
        super({ key: 'demo', active: true });
    }

    preload ()
    {
        // this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('arrow', 'assets/sprites/longarrow.png');
    }

    create ()
    {
        this.arrow = this.add.image(400, 300, 'arrow').setOrigin(0, 0.5);

        this.input.once('pointerdown', function ()
        {

            this.scene.swapPosition('background');

        }, this);
    }

    update (time, delta)
    {
        this.arrow.rotation += 0.01;
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#000000',
    parent: 'phaser-example',
    scene: [ Background, Demo ]
};

const game = new Phaser.Game(config);

Суть метода `swapPosition`

Метод swapPosition принадлежит менеджеру сцен (this.scene) и позволяет моментально поменять местами две активные сцены в списке рендеринга. Это влияет на порядок, в котором сцены отрисовываются на холсте: сцена, которая была "позади", может оказаться "спереди", и наоборот.

В отличие от перезапуска сцены или сложных манипуляций с видимостью, swapPosition выполняет эту операцию мгновенно и без побочных эффектов для состояния сцен. Это идеально для визуальных трюков, переключения интерфейсов или динамического изменения слоев игры.

Анализ кода: структура сцен

В примере создаются две сцены: Background и Demo. Обратите внимание на параметр active: true в их конструкторах. Это ключевой момент — обе сцены активны и запущены одновременно.

Сцена Background загружает изображение лица и размещает его частично за левым краем экрана.

this.face = this.add.image(-10, 300, 'face');

Сцена Demo загружает спрайт стрелки, размещает его в центре и задает точку вращения (setOrigin). В ее методе update стрелка постоянно вращается, визуализируя активность сцены.

this.arrow = this.add.image(400, 300, 'arrow').setOrigin(0, 0.5);
this.arrow.rotation += 0.01;

Изначально, так как Background указана первой в массиве сцен конфигурации, она отрисовывается первой, а сцена Demo — поверх нее. Поэтому мы видим вращающуюся стрелку на фоне изображения лица.

Механика переключения

Взаимодействие с игрой происходит в сцене Demo. В ее методе create устанавливается обработчик однократного нажатия указателя (клика или касания).

this.input.once('pointerdown', function ()
{
    this.scene.swapPosition('background');
}, this);

При срабатывании события вызывается this.scene.swapPosition('background'). Система находит активную сцену с ключом 'background' и меняет ее позицию в списке рендеринга с позицией текущей сцены ('demo').

После этого вызова порядок отрисовки инвертируется. Сцена Demo уходит на задний план, а сцена Background выходит на передний. Визуально это выглядит так, будто неподвижное черно-белое лицо резко "перекрывает" вращающуюся стрелку.

Конфигурация игры и важные нюансы

Обе сцены передаются в массив при создании экземпляра игры. Важен их порядок в этом массиве — он определяет начальный порядок слоев (z-index).

scene: [ Background, Demo ]

Важное ограничение метода swapPosition: он работает только между **активными** сценами. Сцена должна быть запущена (не находиться в состоянии сна или ожидания). В нашем примере это обеспечено параметром active: true. Если бы одна из сцен была неактивна, вызов метода не дал бы эффекта.

Также стоит помнить, что метод меняет местами сцены глобально, в менеджере сцен игры, а не только для текущего вызова.

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

Метод swapPosition — это ваш инструмент для мгновенного и эффективного управления слоями в Phaser 3. Он открывает простор для экспериментов: попробуйте использовать его для создания эффекта "всплывающего" фона в головоломке, резкой смены планов в визуальной новелле или для переключения сложных интерфейсных панелей в стратегической игре. Вы можете вызывать его по таймеру, при достижении определенного счета или в ответ на другие игровые события, чтобы добавить динамики в визуальное представление вашего проекта.