SceneManager: добавление, запуск и остановка сцен

В библиотеке Phaser 3 сцены являются фундаментальной единицей организации игрового контента. Каждая сцена инкапсулирует отдельный участок логики: меню, уровень, игровое поле или экран загрузки. Управление сценами осуществляется через SceneManager, доступный в объекте this.scene внутри любой сцены.


Добавление сцен

Сцены могут быть зарегистрированы несколькими способами:

  1. Через конфигурацию игры
const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    scene: [BootScene, MenuScene, GameScene]
};
const game = new Phaser.Game(config);

В массиве scene перечисляются классы или объекты сцен, которые будут зарегистрированы при инициализации игры.

  1. Динамическое добавление сцен Сцены можно добавлять после создания игры с помощью метода add:
this.scene.add('PauseScene', PauseScene, false);
  • Первый аргумент — ключ сцены (string), используемый для её идентификации.
  • Второй аргумент — класс или объект сцены.
  • Третий аргумент — флаг автоматического запуска (true — сцена стартует сразу после добавления, false — нет).

Добавление сцены не запускает её автоматически, если явно не указан третий параметр.


Запуск сцен

Метод start запускает сцену и автоматически останавливает текущую сцену (если она не была настроена на параллельный запуск):

this.scene.start('GameScene');

Ключевые особенности метода start:

  • Если сцена уже активна, она будет перезапущена (вызываются методы init и create).
  • Любые данные можно передать через второй параметр:
this.scene.start('GameScene', { level: 3, score: 100 });
  • Параметры доступны в методе init сцены:
init(data) {
    this.level = data.level;
    this.score = data.score;
}

Метод launch используется для одновременного запуска нескольких сцен, не останавливая текущую:

this.scene.launch('HUDScene');

Это удобно для интерфейсов или фоновых эффектов, которые должны работать параллельно с основной сценой.


Остановка и удаление сцен

Остановка сцены осуществляется через метод stop:

this.scene.stop('GameScene');
  • При остановке вызывается метод shutdown, который позволяет корректно освободить ресурсы.
  • Если нужно полностью удалить сцену из менеджера, используется remove:
this.scene.remove('GameScene');

Разница между stop и remove:

Метод Действие
stop Сцена перестает быть активной, но остаётся в памяти для возможного старта
remove Сцена удаляется из SceneManager, повторное использование потребует добавления заново

Пауза и возобновление сцен

Phaser поддерживает приостановку сцены без её полной остановки:

this.scene.pause('GameScene');
this.scene.resume('GameScene');
  • pause останавливает обновления сцены (update), но рендеринг остаётся активным.
  • resume возобновляет обновления, сохраняя состояние объектов.

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


Взаимодействие между сценами

Передача данных между сценами может выполняться через:

  1. Методы start и launch с параметрами (init(data)).
  2. Глобальное хранилище — объект this.registry:
this.registry.set('playerHealth', 100);
let health = this.registry.get('playerHealth');
  1. События SceneManager — метод events позволяет слушать и отправлять события:
// В сцене GameScene
this.scene.get('HUDScene').events.emit('scoreChanged', 50);

// В HUDScene
this.events.on('scoreChanged', (score) => {
    this.scoreText.setText('Score: ' + score);
});

Контроль порядка сцен

Сцены можно запускать в параллели или последовательно. Phaser позволяет задавать приоритет сцены через методы bringToTop и sendToBack:

this.scene.bringToTop('HUDScene'); // HUD поверх игрового уровня
this.scene.sendToBack('BackgroundScene'); // Фон позади всех остальных сцен
  • Это важно для UI и слоёв, которые должны отображаться поверх основной сцены.
  • Параллельные сцены обновляются независимо, но порядок рендеринга определяется сценой, находящейся выше в стеке.

Жизненный цикл сцены

Основные методы жизненного цикла сцены:

  • init(data) — подготовка данных перед созданием.
  • preload() — загрузка ассетов.
  • create() — инициализация объектов и логики сцены.
  • update(time, delta) — основной игровой цикл сцены.
  • shutdown() — очистка ресурсов при остановке сцены.
  • destroy() — окончательное удаление сцены из памяти.

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


Резюме

SceneManager предоставляет гибкие инструменты для:

  • Регистрации и динамического добавления сцен.
  • Запуска, паузы, возобновления и остановки сцен.
  • Передачи данных и организации взаимодействия между сценами.
  • Контроля порядка отображения и параллельного выполнения.

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