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

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

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super({ key: "Boot" });
    }

    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(400, 300, 'face');
    }
}


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

const game = new Phaser.Game(config);

game.scene.add('Boot', Example);
game.scene.start('Boot');

Структура сцены: от класса до ключа

Вся логика отдельной части игры (меню, уровень, загрузочный экран) инкапсулируется в классе, унаследованном от Phaser.Scene. Ключевой момент — передача объекта конфигурации с уникальным key в конструктор родительского класса.

class Example extends Phaser.Scene
{
    constructor ()
    {
        super({ key: "Boot" });
    }

Здесь key: "Boot" — это идентификатор сцены, по которому мы будем ссылаться на неё извне. Этот ключ используется для регистрации сцены в менеджере и её последующего запуска.

Жизненный цикл сцены: preload и create

Phaser вызывает методы сцены в строгом порядке. preload() предназначен для загрузки ассетов (изображений, звуков, данных). В этом примере мы задаём базовый URL и загружаем одно изображение.

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

Метод create() вызывается один раз после успешной загрузки всех ресурсов, объявленных в preload(). Здесь происходит первоначальная настройка игровых объектов. Мы создаём спрайт изображения и помещаем его в центр.

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

Координаты (400, 300) соответствуют центру холста размером 800x600 пикселей, заданного в конфиге игры.

Создание игры и ручное управление сценами

Конфигурационный объект передаётся в конструктор Phaser.Game. Обратите внимание, что в нём не указано свойство scene, которое обычно используется для автозапуска сцены.

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

const game = new Phaser.Game(config);

После создания экземпляра игры мы вручную регистрируем наш класс сцены в менеджере сцен, используя заранее определённый ключ 'Boot'.

game.scene.add('Boot', Example);

Финальный шаг — явный запуск зарегистрированной сцены по её ключу. На этом этапе Phaser начнёт исполнять её жизненный цикл (preload, create, update).

game.scene.start('Boot');

Этот двухэтапный подход (add, затем start) даёт полный контроль над моментом инициализации.

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

Ручная регистрация и запуск сцены — мощный паттерн для сложных сценариев инициализации. Он позволяет, например, сначала создать и запустить сцену-загрузчик, которая загрузит общие ресурсы, а уже потом добавить и переключиться на основную игровую сцену. Поэкспериментируйте: создайте вторую сцену (MainMenu) и переключитесь на неё из сцены Boot по клику на изображение или по таймеру, используя метод this.scene.start('MainMenu').