Phaser предоставляет мощный механизм управления сценами, который позволяет создавать слои интерфейса и реализовывать паузу без остановки основной логики игры. Сцены-оверлеи (overlay scenes) — это отдельные сцены, которые накладываются поверх основной игры, оставаясь независимыми и управляемыми отдельно. Их ключевая особенность заключается в том, что они могут отображать UI, меню или уведомления, не вмешиваясь напрямую в логику базовой сцены.
Оверлейная сцена наследует стандартную структуру
Phaser.Scene. Основные методы остаются прежними:
preload(), create() и update().
Разница заключается в том, что оверлей запускается с помощью
scene.launch(), а не scene.start(), что
позволяет основной сцене продолжать работать или оставаться на паузе в
зависимости от логики.
class PauseOverlay extends Phaser.Scene {
constructor() {
super({ key: 'PauseOverlay' });
}
preload() {
this.load.image('pause_bg', 'assets/pause_bg.png');
this.load.image('resume_btn', 'assets/resume_btn.png');
}
create() {
this.bg = this.add.image(400, 300, 'pause_bg').setInteractive();
this.resumeButton = this.add.image(400, 400, 'resume_btn').setInteractive();
this.resumeButton.on('pointerdown', () => {
this.scene.stop(); // Закрывает оверлей
this.scene.resume('MainGame'); // Возобновляет основную игру
});
}
}
Особенности:
scene.launch('PauseOverlay') запускает оверлей,
оставляя основную сцену активной или на паузе.scene.pause('MainGame') полностью останавливает
обновление основной сцены.Phaser поддерживает несколько одновременно активных сцен. Стек сцен позволяет накладывать оверлеи друг на друга. Для реализации сложных UI, например, меню паузы с дополнительными настройками, можно использовать следующий подход:
this.scene.launch('PauseOverlay');
this.scene.pause('MainGame');
Если требуется открыть дополнительный оверлей поверх уже существующего, используется:
this.scene.launch('SettingsOverlay');
Возврат к предыдущей сцене осуществляется через
scene.stop() или scene.resume().
Для UI важно, чтобы оверлей не полностью закрывал игровое поле.
Phaser позволяет задавать прозрачность через
this.cameras.main.setAlpha() или используя спрайты с
альфа-каналом.
this.cameras.main.setAlpha(0.5); // Полупрозрачный фон для оверлея
Можно также применять фильтры или затемнение основной сцены:
this.scene.get('MainGame').cameras.main.setTint(0x000000);
Это создаёт визуальный эффект «заморозки» игры при открытии меню паузы.
Оверлейные сцены могут передавать события в основную игру через систему событий Phaser:
// В оверлейной сцене
this.events.emit('resumeGame');
// В основной сцене
this.events.on('resumeGame', () => {
this.scene.resume();
});
Такой подход гарантирует независимость логики UI от основной игры и позволяет легко масштабировать систему оверлеев.
При паузе основной сцены все таймеры и анимации останавливаются. Для
сохранения отдельных элементов, например, фона с анимацией, можно
запускать их в оверлейной сцене отдельно. Phaser также поддерживает
time.paused для гибкого контроля:
this.scene.pause('MainGame');
// Основная сцена останавливается
this.time.delayedCall(2000, () => {
console.log('Эта задержка сработает только в оверлейной сцене');
}, [], this);
setInteractive() и события pointerdown.scene.stop()
для оверлея и scene.resume() для основной сцены.scene.launch().Сцены-оверлеи позволяют строить гибкую и масштабируемую систему интерфейсов, сохраняя независимость основной логики игры и обеспечивая плавное взаимодействие с пользователем.