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

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

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

Живой запуск

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

Исходный код


class MyScene extends Phaser.Scene {

    constructor (config)
    {
        super(config);
    }

    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.WEBGL,
    width: 800,
    height: 600,
    backgroundColor: '#000000',
    parent: 'phaser-example',
    scene: MyScene
};

const game = new Phaser.Game(config);

Структура класса сцены

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

Ключевой момент — вызов super(config) в конструкторе. Это передаёт конфигурацию родительскому классу Phaser, инициализируя сцену корректно.

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

Метод preload: загрузка ресурсов

Жизненный цикл сцены начинается с метода preload(). Он вызывается автоматически один раз и предназначен для предварительной загрузки всех необходимых ресурсов: изображений, звуков, данных. Загрузка в этом методе гарантирует, что к моменту создания сцены все ассеты будут готовы.

В примере мы сначала задаём базовый URL для загрузчиков с помощью this.load.setBaseURL(), а затем добавляем в очередь загрузки одно изображение с ключом 'face'.

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

Метод create: создание игровых объектов

Следующий этап — метод create(). Он вызывается после успешного завершения preload(). Здесь происходит основная настройка сцены: создание спрайтов, текстур, настройка физики, ввод данных и т.д.

В нашем случае мы создаём объект изображения (Image) и помещаем его в центр экрана с координатами (400, 300), используя ранее загруженный ключ 'face'. Ссылка на объект сохраняется в свойстве сцены this.face для возможного дальнейшего доступа.

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

Конфигурация игры и запуск

Чтобы игра заработала, необходимо создать объект конфигурации и передать его в конструктор Phaser.Game. Конфигурация определяет основные параметры, такие как тип рендерера, размеры холста и, что самое важное, стартовую сцену.

Обратите внимание на поле scene: MyScene. Именно здесь мы указываем класс нашей сцены. Phaser сам создаст её экземпляр при запуске игры. Константа game хранит ссылку на основной экземпляр игры.

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

const game = new Phaser.Game(config);

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

Вы создали свою первую функциональную сцену в Phaser 3, используя ES6 класс. Это база для любой игры. Для экспериментов попробуйте: загрузить и отобразить несколько разных изображений, изменить их позицию, добавить простую анимацию через свойство this.face.setScale() или this.face.setAlpha(), а также создать вторую сцену и переключаться между ними с помощью this.scene.start().