В 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 для плавного
исчезновения, что уменьшает нагрузку на рендеринг.Эмиттеры с несколькими текстурами и фреймами позволяют создавать реалистичные и динамичные эффекты, от магических взрывов до огня и дыма, управлять ими программно и комбинировать для достижения нужного визуального результата.