О чем этот пример

Работа с игровым временем — фундамент для плавной анимации, таймеров и геймплея. В примере `bugs/4704 scene time.js` демонстрируется ключевое свойство `this.time.now`, которое возвращает текущее время жизни сцены в миллисекундах. Эта статья объяснит, как это время ведёт себя при перезапуске сцены, что критично для реализации пауз, рестартов и синхронизации игровых событий.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super('Example');
    }

    create ()
    {
        this.logTime = true;

        console.log('create', this.time.now);

        this.input.once('pointerdown', () => {
            this.scene.restart();
        });
    }

    update ()
    {
        if (this.logTime)
        {
            console.log('update', this.time.now);
            this.logTime = false;
        }
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#000000',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Инициализация сцены и логирование

В методе create() сцена инициализирует флаг this.logTime = true и сразу выводит в консоль своё текущее время при создании. Это момент "рождения" сцены.

create ()
{
    this.logTime = true;
    console.log('create', this.time.now);
}

Свойство this.time.now возвращает время в миллисекундах, прошедшее с момента старта игры. Именно это значение фиксируется при создании сцены.

Перезапуск сцены по клику

В том же методе create() навешивается одноразовый обработчик клика, который вызывает this.scene.restart(). Этот метод полностью пересоздаёт текущую сцену: уничтожает все её объекты и снова запускает create().

this.input.once('pointerdown', () => {
    this.scene.restart();
});

Важно: this.scene.restart() — это вызов API из экземпляра сцены. После перезапуска внутренние часы сцены (this.time) сбрасываются, и this.time.now начинает отсчёт заново для этой конкретной сцены.

Логирование времени в игровом цикле

Метод update() выполняется каждый кадр. В нашем примере он используется для однократного логирования времени сразу после создания сцены.

update ()
{
    if (this.logTime)
    {
        console.log('update', this.time.now);
        this.logTime = false;
    }
}

Условие if (this.logTime) гарантирует, что сообщение выведется только один раз. Значение this.time.now в update() будет немного больше, чем в create(), так как между вызовами этих методов проходит минимум один игровой тик.

Поведение времени при перезапуске (ключевой вывод)

Запустив пример и кликнув, вы увидите в консоли последовательность, подобную этой:

create 123.4
update 123.8
// После клика
create 0.1
update 0.5

**Главный вывод:** При вызове this.scene.restart() время сцены this.time.now сбрасывается практически до нуля. Это происходит потому, что перезапуск создаёт совершенно новый экземпляр сцены со своим внутренним отсчётом времени, независимым от общего времени жизни игры (game.loop.now).

Что попробовать дальше

Свойство this.time.now — это локальное время жизни сцены, которое обнуляется при её перезапуске. Это знание помогает корректно реализовывать рестарты уровней, не накапливая ошибки времени. Для экспериментов: попробуйте сравнить this.time.now с глобальным this.game.loop.now, создать таймер this.time.addEvent до рестарта и посмотреть, сохранится ли он, или реализовать плавный рестарт без сброса времени для некоторых логических систем.