В библиотеке Phaser 3 сцены являются фундаментальной
единицей организации игрового контента. Каждая сцена инкапсулирует
отдельный участок логики: меню, уровень, игровое поле или экран
загрузки. Управление сценами осуществляется через
SceneManager, доступный в объекте
this.scene внутри любой сцены.
Сцены могут быть зарегистрированы несколькими способами:
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scene: [BootScene, MenuScene, GameScene]
};
const game = new Phaser.Game(config);
В массиве scene перечисляются классы или объекты сцен,
которые будут зарегистрированы при инициализации игры.
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 возобновляет обновления,
сохраняя состояние объектов.Эта функциональность полезна для пауз, меню и временных эффектов, когда нужно приостановить логику, но не закрывать сцену.
Передача данных между сценами может выполняться через:
start и launch с
параметрами (init(data)).this.registry:this.registry.set('playerHealth', 100);
let health = this.registry.get('playerHealth');
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'); // Фон позади всех остальных сцен
Основные методы жизненного цикла сцены:
init(data) — подготовка данных перед
созданием.preload() — загрузка ассетов.create() — инициализация объектов и
логики сцены.update(time, delta) — основной игровой
цикл сцены.shutdown() — очистка ресурсов при
остановке сцены.destroy() — окончательное удаление
сцены из памяти.Правильное использование жизненного цикла сцены обеспечивает стабильность и оптимизацию производительности, особенно при сложных проектах с множеством уровней.
SceneManager предоставляет гибкие инструменты для:
Эффективное использование этих возможностей позволяет строить сложные игровые архитектуры, обеспечивая логическую разбиение игры на независимые, но взаимодействующие блоки.