~1 мин чтения

Частицы

Эмиттер частиц — типичные эффекты, анатомия конфигурации и компромиссы производительности, которые действительно важны.

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

Структура эмиттера

const emitter = this.add.particles(0, 0, 'spark', {
	speed: { min: 80, max: 160 },
	angle: { min: 250, max: 290 },
	scale: { start: 1, end: 0 },
	alpha: { start: 1, end: 0 },
	lifespan: 600,
	frequency: 30,        // мс между испусканиями; -1 означает «режим взрыва»
	quantity: 1,          // частиц за одно испускание
	blendMode: 'ADD',
});
emitter.startFollow(player);

Две ключевые идеи:

  • Случайность для каждой частицы через объекты-диапазоны. speed: { min, max } рандомизирует начальное значение; scale: { start, end } интерполирует от начального к конечному значению на протяжении времени жизни частицы.
  • Темп для всего эмиттера через frequency + quantity. Вместе они задают «частиц в секунду». frequency: -1 переключает в режим взрыва — испустить quantity частиц одновременно при вызове emitter.explode().

Живой пример

Непрерывный шлейф искр, следующий за невидимой целью, движущейся по окружности.

Spark trail Phaser 4 · sandboxed

Режим взрыва

const burst = this.add.particles(0, 0, 'spark', {
	speed: { min: 120, max: 260 },
	lifespan: 500,
	scale: { start: 1, end: 0 },
	emitting: false,         // не испускать автоматически
});

// Позже, по событию:
burst.emitParticleAt(player.x, player.y, 30);

emitting: false — это ключ — он подавляет непрерывный поток, чтобы можно было запускать всплески вручную.

Зоны эмиттера

Порождайте или уничтожайте частицы в произвольных формах:

const emitter = this.add.particles(0, 0, 'spark', {
	emitZone: { type: 'edge', source: new Phaser.Geom.Circle(0, 0, 50), quantity: 64 },
	// или 'random' для заполнения области порождением
});

emitZone управляет тем, где частицы рождаются; deathZone удаляет любые, попадающие в заданную форму — полезно для эффекта «частицы поглощаются предметом».

Типичные рецепты

Дым — медленный, крупный, затухающий, без аддитивного смешивания.

{ speed: 20, scale: { start: 0.4, end: 1.6 }, alpha: { start: 0.6, end: 0 },
  lifespan: 1500, frequency: 80, blendMode: 'NORMAL' }

Взрыв — быстрый, аддитивный, единичный всплеск.

{ speed: { min: 200, max: 400 }, scale: { start: 1, end: 0 },
  lifespan: 400, blendMode: 'ADD', emitting: false }
// ...затем emitter.explode(50, x, y);

Шлейф — высокая частота, короткое время жизни, следует за целью.

{ speed: 10, scale: { start: 0.5, end: 0 }, lifespan: 200,
  frequency: 10, follow: target, blendMode: 'ADD' }

Производительность

  • Смешивание ADD — самая дорогая операция. Переключитесь на NORMAL, если эффект свечения не нужен.
  • Размер текстуры частицы важнее их количества. Эмиттер на 1000 частиц с искрами 8×8 дешевле, чем 100 частиц с клубами 256×256.
  • Ограничивайте одновременное число частиц с помощью maxParticles — это предотвращает патологические всплески, когда произведение frequency × lifespan становится большим.

Связанные материалы

  • Игровые объекты — менеджер частиц сам является игровым объектом и может быть добавлен в контейнеры.
  • Шейдеры — для эффектов, выходящих за пределы того, что можно выразить режимами смешивания.