Эмиттеры с несколькими текстурами и фреймами

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

Настройка эмиттера с несколькими текстурами

Эмиттер в Phaser может использовать один спрайт или несколько. Для задания нескольких текстур используется массив строк с названиями текстур или фреймов:

const particles = this.add.particles('spritesheetKey');

const emitter = particles.createEmitter({
    x: 400,
    y: 300,
    speed: { min: 100, max: 200 },
    lifespan: 2000,
    scale: { start: 1, end: 0 },
    frame: ['frame1', 'frame2', 'frame3']
});

Ключевые моменты:

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

Использование спрайтшитов и анимации

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

this.load.spritesheet('fire', 'assets/fire.png', { frameWidth: 32, frameHeight: 32 });

const fireParticles = this.add.particles('fire');

const fireEmitter = fireParticles.createEmitter({
    x: 400,
    y: 300,
    speed: { min: 50, max: 150 },
    lifespan: 1000,
    frame: [0, 1, 2, 3, 4, 5],
    scale: { start: 1, end: 0 },
    blendMode: 'ADD'
});

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

  • Нумерация фреймов соответствует порядку в спрайтшите.
  • blendMode: 'ADD' делает частицы светящимися и полупрозрачными, что полезно для огня и магических эффектов.
  • Для сложных эффектов можно комбинировать несколько эмиттеров с разными диапазонами фреймов.

Комбинирование нескольких эмиттеров

Для создания насыщенных визуальных эффектов часто используют несколько эмиттеров одновременно:

const explosionParticles = this.add.particles('explosion');

const sparkEmitter = explosionParticles.createEmitter({
    x: 400,
    y: 300,
    speed: { min: 100, max: 300 },
    lifespan: 600,
    frame: ['spark1', 'spark2'],
    quantity: 10
});

const smokeEmitter = explosionParticles.createEmitter({
    x: 400,
    y: 300,
    speed: { min: 20, max: 60 },
    lifespan: 2000,
    frame: ['smoke1', 'smoke2', 'smoke3'],
    alpha: { start: 0.8, end: 0 },
    scale: { start: 0.5, end: 2 }
});

Преимущества такого подхода:

  • Разделение логики на несколько эмиттеров позволяет легко настраивать разные типы частиц.
  • Можно создавать эффекты с различной продолжительностью и скоростью.
  • Обеспечивается реалистичное взаимодействие нескольких визуальных элементов.

Управление случайностью фреймов

Phaser позволяет контролировать распределение фреймов через функцию frame:

frame: function(particle) {
    const frames = ['frameA', 'frameB', 'frameC'];
    return frames[Math.floor(Math.random() * frames.length)];
}

Преимущества использования функции:

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

Анимация частиц с помощью emitParticleAt

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

emitter.emitParticleAt(200, 150, 5, { frame: ['flash1', 'flash2'] });
  • Параметр 5 задаёт количество частиц.
  • Опция frame позволяет задавать массив фреймов, который будет использоваться только для этих частиц.
  • Это полезно для вспышек, ударов или попаданий.

Смешивание текстур через группы частиц

Можно объединять эмиттеры с разными текстурами в одну систему:

const particleGroup = this.add.particles();

const emitter1 = particleGroup.createEmitter({ texture: 'texture1', ... });
const emitter2 = particleGroup.createEmitter({ texture: 'texture2', ... });
  • Позволяет синхронизировать частицы с разными визуальными стилями.
  • Оптимизирует производительность, так как используется один контейнер частиц.
  • Упрощает управление эффектами через общие методы группы.

Рекомендации по оптимизации

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

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