Остановка, пауза и перезапуск эмиттера

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


Методы остановки эмиттера

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

  • emitter.stop() Этот метод мгновенно прекращает эмиссию. Частицы, уже находящиеся в сцене, продолжают жить до конца своей жизни. Пример:
emitter.stop();
  • emitter.on = false Альтернатива для более простого контроля: свойство on отключает генерацию новых частиц, сохраняя текущие.
emitter.on = false;

Особенность: остановка эмиттера не очищает его полностью. Частицы продолжают анимироваться, пока их время жизни не истечет.


Пауза эмиттера

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

  • emitter.pause() При вызове этого метода генерация частиц приостанавливается, а существующие частицы продолжают двигаться по своим траекториям.
emitter.pause();
  • emitter.resume() Возобновляет работу паузированного эмиттера, продолжая создание новых частиц с момента остановки.
emitter.resume();

Примечание: В Phaser 3 пауза и возобновление реализованы через управление active и paused состояниями эмиттера:

emitter.paused = true;  // пауза
emitter.paused = false; // возобновление

Перезапуск эмиттера

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

  • emitter.explode(count, x, y) Мгновенно создаёт определённое количество частиц в указанной позиции, часто применяется для эффектов взрыва. После вызова эмиссия может продолжаться в обычном режиме.
emitter.explode(50, 400, 300);
  • emitter.start() Полный перезапуск эмиттера с текущими конфигурациями. Частицы начинают генерироваться заново, даже если ранее эмиттер был остановлен или приостановлен.
emitter.start();
  • emitter.removeAll(true) Используется для очистки всех существующих частиц перед перезапуском. Опция true гарантирует уничтожение активных частиц.
emitter.removeAll(true);
emitter.start();

Совет: комбинация stop() + removeAll(true) + start() позволяет полностью сбросить эмиттер, что удобно при смене уровня или при перезапуске эффекта.


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

Эмиттеры тесно интегрируются с системой событий Phaser. Использование событий позволяет более гибко контролировать паузу и перезапуск:

  • Событие завершения эмиттера
emitter.onParticleDeath.add(function(particle) {
    console.log('Частица уничтожена');
});
  • Таймер для автоматической паузы или перезапуска
this.time.delayedCall(2000, () => {
    emitter.pause();
});

this.time.delayedCall(4000, () => {
    emitter.resume();
});
  • Автоматическое уничтожение эмиттера после завершения
emitter.on = false;
emitter.removeAll(true);

Практические рекомендации

  1. Экономия ресурсов: Если эффект временный, предпочтительно использовать stop() и removeAll(true) вместо полного создания нового эмиттера.

  2. Плавное управление: Для постепенного прекращения эффекта полезно уменьшать frequency или quantity частиц перед полной остановкой.

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

  4. Разделение логики: Логику эмиттера лучше держать отдельно от основной игровой логики. Это облегчает перезапуск, изменение параметров и отладку.


Ключевые свойства и методы для управления эмиттером

Свойство / Метод Описание
stop() Останавливает эмиссию, частицы продолжают жить
pause() Приостанавливает эмиссию, состояние сохраняется
resume() Возобновляет паузу эмиттера
start() Перезапускает эмиттер с текущими настройками
explode(count, x, y) Мгновенная генерация указанного числа частиц
removeAll(true) Уничтожает все текущие частицы
on Управление включением/выключением эмиттера
paused Флаг паузы для управления через свойство

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