Методы жизненного цикла сцены: init, preload, create, update, shutdown, destroy

В библиотеке 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 вызывается на каждом кадре игры и отвечает за динамическую логику: движение объектов, проверку коллизий, обработку пользовательского ввода и обновление состояния игры.

Особенности использования:

  • Частота вызова зависит от FPS и настройки рендеринга.
  • Не следует создавать новые объекты в 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 — окончательная очистка и освобождение памяти.

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