В библиотеке Phaser жизненный цикл сцены управляется набором стандартных методов, которые вызываются автоматически в определённой последовательности. Понимание их работы критично для правильной организации кода, управления ресурсами и оптимизации производительности.
initМетод init вызывается первым при запуске сцены, до
загрузки каких-либо ресурсов. Его основная задача — инициализация
переменных сцены, передача параметров и подготовка внутреннего состояния
объекта сцены.
Особенности использования:
scene.start('sceneKey', data).Пример:
class MyScene extends Phaser.Scene {
constructor() {
super({ key: 'MyScene' });
}
init(data) {
this.playerLives = data.lives || 3;
this.score = 0;
}
}
preloadМетод preload используется для загрузки всех необходимых
ресурсов перед созданием сцены. В него помещаются вызовы загрузчиков
изображений, аудио, шрифтов и других ассетов. Phaser обеспечивает
асинхронную загрузку и автоматически ждёт завершения всех операций перед
переходом к create.
Особенности использования:
this.load (image,
spritesheet, audio,
tilemapTiledJSON и другие).progress и
complete для отображения прогресса загрузки.preload вызывается один раз при первом запуске сцены.
Если сцена будет перезапущена, ресурсы уже находятся в кэше.Пример:
preload() {
this.load.image('player', 'assets/player.png');
this.load.spritesheet('enemy', 'assets/enemy.png', { frameWidth: 32, frameHeight: 32 });
this.load.audio('bgMusic', 'assets/music.mp3');
this.load.on('progress', (value) => {
console.log(`Загрузка: ${Math.round(value * 100)}%`);
});
this.load.on('complete', () => {
console.log('Все ресурсы загружены');
});
}
createМетод create вызывается после завершения
preload и предназначен для создания игровых объектов,
анимаций, интерфейсов и запуска начальной логики сцены. На этом этапе
можно безопасно использовать все загруженные ресурсы.
Особенности использования:
this.add.sprite,
this.physics.add.sprite.this.anims.create.this.time.addEvent или
this.events.Пример:
create() {
this.player = this.physics.add.sprite(100, 200, 'player');
this.enemyGroup = this.physics.add.group();
this.anims.create({
key: 'walk',
frames: this.anims.generateFrameNumbers('enemy', { start: 0, end: 3 }),
frameRate: 10,
repeat: -1
});
this.sound.play('bgMusic', { loop: true });
}
updateМетод update вызывается на каждом кадре игры и отвечает
за динамическую логику: движение объектов, проверку коллизий, обработку
пользовательского ввода и обновление состояния игры.
Особенности использования:
update, это
снижает производительность.Пример:
update(time, delta) {
if (this.cursors.left.isDown) {
this.player.setVelocityX(-200);
} else if (this.cursors.right.isDown) {
this.player.setVelocityX(200);
} else {
this.player.setVelocityX(0);
}
Phaser.Actions.Call(this.enemyGroup.getChildren(), function(enemy) {
enemy.y += 1;
}, this);
}
shutdownМетод shutdown вызывается, когда сцена останавливается,
но не уничтожается полностью. Используется для очистки временных
объектов, слушателей событий и таймеров, чтобы они не оставались
активными при повторном запуске сцены.
Особенности использования:
destroy: shutdown не очищает
полностью сцену, она может быть перезапущена.Пример:
shutdown() {
this.events.off('someEvent', this.handleEvent, this);
this.sound.stopAll();
}
destroyМетод destroy вызывается при полном удалении сцены из
памяти. Он предназначен для окончательной очистки всех ресурсов сцены,
уничтожения объектов и освобождения памяти.
Особенности использования:
shutdown.destroy сцена не может быть повторно использована
без создания нового экземпляра.Пример:
destroy() {
this.player.destroy();
this.enemyGroup.clear(true, true);
this.text.destroy();
}
Последовательность вызова методов выглядит следующим образом:
init → preload → create → update → shutdown → destroy
init — подготовка состояния и параметров сцены.preload — загрузка всех ресурсов.create — создание объектов и начальной логики.update — постоянное обновление состояния сцены.shutdown — временная остановка и очистка
слушателей.destroy — окончательная очистка и освобождение
памяти.Правильная организация методов жизненного цикла обеспечивает эффективное использование ресурсов, удобное управление сценами и упрощает масштабирование игры.