Timers: addEvent и повторяющиеся события

В Phaser таймеры являются мощным инструментом для управления временем в игровом цикле. Они позволяют запускать функции через определённый интервал, создавать повторяющиеся действия и управлять сложными последовательностями событий.


Метод this.time.addEvent

Метод addEvent объекта time используется для создания таймера с определёнными параметрами. Его базовый синтаксис выглядит следующим образом:

this.time.addEvent({
    delay: 1000,          // задержка в миллисекундах
    callback: myFunction, // функция, вызываемая по истечении задержки
    callbackScope: this,  // контекст выполнения функции
    repeat: 0,            // количество повторений (0 — один раз)
    loop: false           // повторять бесконечно
});
  • delay — задаёт интервал в миллисекундах между вызовами функции.
  • callback — функция, которая будет выполнена.
  • callbackScope — контекст this, который будет использоваться внутри функции. Если не указан, используется глобальный контекст.
  • repeat — количество дополнительных повторов после первого вызова. Например, repeat: 2 вызовет функцию трижды (первый вызов + 2 повторения).
  • loop — если true, событие будет повторяться бесконечно с указанной задержкой.

Пример одноразового события

this.time.addEvent({
    delay: 2000,
    callback: () => {
        console.log('Событие сработало через 2 секунды');
    },
    callbackScope: this
});

В этом примере функция выполнится один раз через 2 секунды после добавления события.


Повторяющиеся события с repeat

Для повторяющихся действий используется параметр repeat. Например, если необходимо выполнить действие пять раз с интервалом 1 секунда:

this.time.addEvent({
    delay: 1000,
    callback: () => {
        console.log('Повторяющееся событие');
    },
    repeat: 4,
    callbackScope: this
});

Особенности:

  • Функция будет вызвана пять раз (первый вызов + 4 повторения).
  • Интервал между вызовами всегда соответствует значению delay.
  • После завершения всех повторов событие автоматически уничтожается.

Бесконечные циклы с loop

Для создания бесконечных таймеров используется параметр loop. Это удобно для периодического обновления состояния игры, анимаций или спавна объектов:

this.time.addEvent({
    delay: 500,
    callback: () => {
        console.log('Бесконечный таймер каждые 0.5 секунды');
    },
    loop: true
});
  • Значение repeat игнорируется, если установлен loop: true.
  • Таймер продолжает работать до тех пор, пока не будет явно остановлен методом remove.

Управление событиями таймера

Метод addEvent возвращает объект TimerEvent, который предоставляет возможности управления:

let timerEvent = this.time.addEvent({
    delay: 1000,
    callback: () => console.log('Таймер'),
    loop: true
});

// Остановка таймера
timerEvent.remove(false); // false — не вызывает callback при удалении

// Пауза таймера
timerEvent.paused = true;

// Возобновление таймера
timerEvent.paused = false;

Ключевые свойства и методы TimerEvent:

  • paused — булевое значение, останавливающее или возобновляющее таймер.
  • elapsed — количество времени, прошедшее с начала таймера.
  • repeatCount — количество повторений, уже выполненных таймером.
  • remove() — удаляет таймер из системы Phaser.

Сценарии использования

  1. Анимация или спавн врагов Таймеры идеально подходят для периодического создания объектов на сцене, например, спавна врагов каждые 3 секунды.

  2. Отложенные эффекты Можно запускать события с задержкой, например, вспышки, выстрелы или таймеры для бонусов.

  3. Секундомеры и обратный отсчёт Используя таймеры с repeat, легко реализовать обратный отсчёт или отслеживание времени уровня.

  4. Комбинации повторяющихся и одноразовых действий Таймеры могут запускать одноразовое действие и после его завершения создавать новый повторяющийся таймер, обеспечивая гибкую последовательность событий.


Практическая оптимизация

  • Для большого числа однотипных таймеров рекомендуется объединять их в группы и отслеживать через массив, чтобы управлять всеми событиями централизованно.
  • Использование loop для коротких интервалов может нагружать цикл рендеринга; важно учитывать производительность при высокой частоте обновлений.
  • Контролирование таймеров через их объект TimerEvent позволяет динамически изменять поведение игры без пересоздания событий.

Взаимодействие с другими системами Phaser

Таймеры Phaser интегрированы с игровым циклом (update) и синхронизируются с scene.time. Это обеспечивает:

  • точное соблюдение задержек даже при изменении FPS;
  • возможность использовать таймеры для синхронизации анимаций, звуков и физики;
  • простое создание сложных сценариев на основе событий и повторений.

Итоговая структура таймера

  • delay — определяет интервал
  • callback — функция, выполняемая по таймеру
  • callbackScope — контекст выполнения
  • repeat — количество повторений
  • loop — бесконечное повторение
  • paused и remove() — управление выполнением

Эта система обеспечивает гибкость и мощь для реализации любых временных сценариев в игре на Phaser.