Particles
Introduction¶
Particles uses its own lightweight physics system, and can interact only with its Emitter's bounds and zones. Built-in game object of phaser.
- Author: Richard Davey
Note
API is not compatible with 3.55.x
Usage¶
Load texture¶
scene.load.image(key, url);
Reference: load image
Add particle¶
var particles = scene.add.particles(x, y, texture, {
// EmitterOp
accelerationX: 0,
accelerationY: 0,
alpha: 1,
angle: { min: 0, max: 360 },
bounce: 0,
color: undefined,
delay: 0,
hold: 0,
lifespan: 1000,
maxVelocityX: 10000,
maxVelocityY: 10000,
moveToX: 0,
moveToY: 0,
quantity: 1,
rotate: 0,
scaleX: 1,
scaleY: 1,
// scale:
speedX: 0,
speedY: 0,
speed:
tint: 0xffffff,
x: 0,
y: 0,
// Emitter properties
active:
advance:
blendMode:
colorEase:
deathCallback:
deathCallbackScope:
duration:
emitCallback:
emitCallbackScope:
// callbackScope
frequency:
gravityX:
gravityY:
maxAliveParticles:
maxParticles:
name:
emitting:
particleBringToTop:
particleClass:
radial:
sortCallback:
sortOrderAsc:
sortProperty:
stopAfter:
tintFill:
timeScale:
trackVisible:
visible:
// Position
// emitZone : random-zone, edge-zone
// random-zone
emitZone: {
type: 'random',
source: geom,
},
// edge-zone
emitZone:{
type: 'edge',
source: geom,
quantity: 1,
stepRate: 0,
total: -1,
yoyo: false,
seamless: true
},
deathZone: {
type: 'onEnter', // 'onEnter', or 'onLeave'
source: geom,
},
bounds: // {x, y, w, h}, or {x, y, width, height}, or Phaser.Geom.Rectangle
collideLeft: true,
collideRight: true,
collideTop: true,
collideBottom: true,
follow:
followOffset:{
x: 0,
y: 0
},
// Texture
texture:
frame:
anim: [], // string, or array of string
reserve: 0,
advance: 0
});
- Parameters of EmitterOp : Number, Random Array, Custom Callback, Stepped start/end, Eased start/end, min/max, Random object, Custom onEmit onUpdate, Interpolation
- A number
{min, max}
: Pick a random value between min and max{min, max, int}
{start, end}
: Pick values incremented continuously across a range. (ease
='Linear'
){start, end, ease}
{start, end, ease, easeParams}
{start, end, steps}
: Pick values incremented by steps across a range.{start, end, steps, yoyo: true}
{start, end, random}
random
:true
orfalse
{random: [start, end]}
: Pick a random number between start and and.[a, b, c, d]
: Pick a random number from an array.{min, max, steps}
: Pick values between min to max, with steps.{ values: [ a, b, c, d ], interpolation: 'catmull', ease: 'linear' }
: Interpolation (linear
,bezier
,catmull
) in values array.function(particle, key, t, value) { return value; }
{onEmit, onUpdate}
: Get return value from a function invoking.function(particle, key, t, value) { return value; }
active
: Whether this emitter updates itself and its particles.false
: Equal to pause.
advance
: If you wish to fast forward the emitter in time, set this value to a number representing the amount of ms the emitter should advance.blendMode
: See blend modecolorEase
: The string-based name of the Easing function to use if you have enabled Particle color interpolation via thecolor
property, otherwise has no effect.deathCallback
,deathCallbackScope
function(particle) { }
emitCallback
,emitCallbackScope
function(particle, emitter) { }
duration
: Limit the emitter to emit particles for a maximum ofduration
ms.0
: Forever, default behavior.
follow
: A Game Object whose position is used as the particle origin.followOffset
: The offset of the particle origin from thefollow target.frequency
0
: One particle flow cycle for each logic update (the maximum flow frequency).> 0
: The time interval between particle flow cycles in ms.-1
: Exploding emitter.
hold
: Frozen or 'held in place' after it has finished its lifespan for a set number of msgravityX
,gravityY
maxAliveParticles
maxParticles
0
: Unlimited.> 0
: Hard limit the amount of particle objects.
frames
: One or more texture frames, or a configuration object.- String or number value
- Array of string or number value
- Configuration object :
{ frames: [], cycle: false, quantity: 1 }
anim
:- String
- Array of string
- Configuration object :
{ anim: [], // Array of string cycle: false, quantity: 1 }
particleBringToTop
:true
: Newly emitted particles are added to the top of the particle list, i.e. rendered above those already alive. Default behavior.
sortCallback
: The callback used to sort the particles.sortProperty
: Optionally sort the particles before they render based on this property. The property must exist on theParticle
class, such asy
,lifeT
,scaleX
, etc.sortOrderAsc
: WhensortProperty
is defined this controls the sorting order, either ascending or descending.stopAfter
: The Particle Emitter will stop emitting particles once this total has been reached. It will then enter a 'stopped' state, firing theSTOP
event.radial
: A radial emitter will emit particles in all directions between angle min and max,emitting
: Controls if the emitter is currently emitting a particle flow (when frequency >= 0). Already alive particles will continue to update until they expire.false
: Equal to stop
tintFill
:timeScale
: The time rate applied to active particles, affecting lifespan, movement, and tweens. Values larger than 1 are faster than normal.trackVisible
: Whether the emitter'svisible
state will track the follow target's visibility state.emitZone
:deathZone
{ type: 'onEnter', // 'onEnter', or 'onLeave' source: geom }
bounds
:{x, y, w, h}
, or{x, y, width, height}
, or Rectangle.collideLeft
,collideRight
,collideTop
,collideBottom
: Whether particles interact with the left/right/top/bottom edge of the bounds.name
particleClass
Control¶
- Start
emitter.start(); // emitter.start(advance, duration);
advance
: Advance this number of ms in time through the emitter.duration
: Limit this emitter to only emit particles for the given number of ms. Setting this parameter will override any duration already set in the Emitter configuration object.
- Stop
emitter.stop(); // emitter.stop(kill);
kill
:true
: Kill all particles immediatelyfalse
: Leave them to die after their lifespan expires. Default behavior.
- Pause
emitter.pause(); // set `active` to false
- Resume
emitter.resume(); // set `active` to true
- Starts (or restarts) a particle flow.
emitter.flow(frequency, count, stopAfter);
frequency
:>= 0
: The time interval of each flow cycle, in ms-1
: Explosion mode.
count
: The number of particles to emit at each flow cycle.stopAfter
: Stop this emitter from firing any more particles once this value is reached.- Setting this parameter will override any
stopAfter
value already set in the Emitter configuration object. 0
: Unlimited
- Setting this parameter will override any
- Explode : Puts the emitter in explode mode (
frequency
=-1
), stopping any current particle flow, and emits several particles all at once.emitter.explode(); // emitter.explode(count, x, y);
count
: The number of Particles to emit.x
,y
: The x, y coordinate to emit the Particles from.
- Emit : Emits particles at the given position. If no position is given, it will emit from this Emitters current location.
or
emitter.emitParticleAt(); // emitter.emitParticleAt(x, y, count);
emitter.emitParticle(count, x, y);
count
: The number of Particles to emit.x
,y
: The x, y coordinate to emit the Particles from.
- Fast forward
emitter.fastForward(time, delta);
time
: The number of ms to advance the Particle Emitter by.delta
: The amount of delta to use for each step. Defaults to1000 / 60
.
- Kill all alive particles
emitter.killAll()
Follow target¶
- Start
emitter.startFollow(target); // emitter.startFollow(target, offsetX, offsetY, trackVisible);
target
: The Game Object to follow.offsetX
,offsetY
: Horizontal/vertical offset of the particle origin from the Game Object.trackVisible
: Whether the emitter's visible state will track the target's visible state.
- Stop
emitter.stopFollow();
Frame¶
emitter.setEmitterFrame(frames);
// emitter.setEmitterFrame(frames, pickRandom, quantity);
frames
: One or more texture frames, or a configuration object.
- String or number value
- Array of string or number value
- Configuration object :
{
frames: [],
cycle: false,
quantity: 1
}
pickRandom
:
- true
: Whether frames should be assigned at random from frames
. Default behavior.
- quantity
: The number of consecutive particles that will receive each frame. Default value is 1
.
Animation¶
emitter.setAnim(anims);
// emitter.setAnim(anims, pickRandom, quantity);
anims
: One or more animations, or a configuration object.
- String
- Array of string
- Configuration object :
{
anims: [],
cycle: false,
quantity: 1
}
anims
: One or more animations names, or Play Animation Config objects.
- String
- Array of string
- Animation config
- Array of Animation config
- pickRandom
:
- true
: Whether frames should be assigned at random from frames
. Default behavior.
- quantity
: The number of consecutive particles that will receive each frame. Default value is 1
.
Particle¶
- Speed
or
emitter.setParticleSpeed(x, y);
emitter.speedX = x; emitter.speedY = y;
- Changes the emitter from radial to a point emitter
- Bounce
emitter.bounce = value;
0
: No bounce1
: Full rebound
- Max velocity
emitter.maxVelocityX = x; emitter.maxVelocityY = y;
- Gravity
or
emitter.setParticleGravity(x, y);
emitter.gravityX = x; emitter.gravityY = y;
- Acceleration
emitter.accelerationX = x; emitter.accelerationY = y;
- Lifespan : Sets the lifespan of newly emitted particles in milliseconds.
or
emitter.setParticleLifespan(time);
emitter.lifespan = time
- The number of milliseconds to wait after emission before the particles start updating.
emitter.delay = time;
- The number of milliseconds to wait after a particle has finished its life before it will be removed.
emitter.hold = time;
- Tint
or
emitter.setParticleTint(tint);
emitter.particleTint = tint;
- Webgl only
- Color
emitter.particleColor = color; // WebGL only. emitter.colorEase = easeName;
- Webgl only
- Alpha
or
emitter.setParticleAlpha(alpha);
oremitter.setAlpha(alpha);
emitter.particleAlpha = alpha;
- Scale : Sets the vertical and horizontal scale of the emitted particles.
or
emitter.setParticleScale(x, y);
oremitter.setScale(x, y);
emitter.particleScaleX = x; emitter.particleScaleY = y;
- Position
emitter.particleX = x; emitter.particleY = y;
- Position to move toward
emitter.moveToX = x; emitter.moveToY = y;
- The angle at which the particles are emitted.
emitter.particleAngle = angle; // degrees
- The rotation (or angle) of each particle when it is emitted.
emitter.particleRotate = rotation; // degrees
- The number of particles that are emitted each time an emission occurs
emitter.quantity = quantity;
- Hard limit the amount of particle objects
var count = emitter.maxParticles;
- Whether this emitter is at its limit
var atLimit = emitter.atLimit();
- Whether this emitter is at its limit
- Alive (active) particles
- Amount of alive particles
or
var count = emitter.getAliveParticleCount();
var count = emitter.alive.length;
- Add callback for newly emitted particle
var callback = function(particle, emitter) { /* ... */ } emitter.onParticleEmit(callback, context);
- Clear callback
emitter.onParticleEmit();
- Clear callback
- For each alive particle
var callback = function(particle, emitter) { /* ... */ } emitter.forEachAlive(callback, context);
- Amount of alive particles
- Dead (inactive) particles
- Amount of dead particles
or
var count = emitter.getDeadParticleCount();
var count = emitter.dead.length;
- Add callback for each particle death
var callback = function(particle, emitter) { /* ... */ } emitter.onParticleDeath(callback, context);
- Clear callback
emitter.onParticleDeath();
- Clear callback
- For each dead particle
var callback = function(particle, emitter) { /* ... */ } emitter.forEachDead(callback, context);
- Add dead particles into pool
emitter.reserve(count);
- Amount of dead particles
- Total (alive + dead) number of particles.
var count = emitter.getParticleCount();
- Active particles overlaps with a Rectangle Geometry object or an Arcade Physics Body.
var particles = emitter.overlap(target);
target
:- A Rectangle.
- Arcade Physics Body.
particles
: An array of Particles that overlap with the given target
- Gets a bounds Rectangle calculated from the bounds of all currently active Particles
emitter.getBounds(padding, advance, delta, output);
padding
: The amount of padding, in pixels, to add to the bounds Rectangle.advance
,delta
: Fast forward in time to try and allow the bounds to be more accurate.output
: The Rectangle to store the results in.
- Gets the bounds of this particle as a Geometry Rectangle
particle.getBounds();
Render order¶
- Sort by property
emitter.setSortProperty(property, ascending);
property
: The property on theParticle
class to sort by.ascending
: Should the particles be sorted in ascending or descending order?
- Sort by callback
var callback = function(particleA, particleB) { return 1; // 0,1,-1 } emitter.setSortCallback(callback);
Emitter¶
- Frequency
emitter.setFrequency(frequency); // emitter.setFrequency(frequency, quantity);
frequency
:>= 0
: The time interval of each flow cycle, in ms-1
: Explosion mode.
quantity
: The number of particles to release at each flow cycle or explosion.
- Quantity
emitter.setQuantity(quantity);
quantity
: The number of particles to release at each flow cycle or explosion.
Zone¶
Emit zone¶
Add emit zone¶
var zone = emitter.addEmitZone({
type: 'random',
source: geom,
});
source
: Geom like Circle, Ellipse, Rectangle,Triangle, Polygon, BitmapZone, or Path or Curve, which hasgetRandomPoint(point)
method- Custom zone
{ getRandomPoint: function(point) { // point.x = ... // point.y = ... return point; } }
- Custom zone
Add emit edge¶
var zone = emitter.addEmitZone({
type: 'edge',
source: curve,
quantity: 1,
stepRate: 0,
yoyo: false,
seamless: true,
total: -1
});
source
: Geom like Circle, Ellipse, Rectangle,Triangle, Polygon, or Path or Curve, which hasgetPoints(quantity, stepRate)
method- Custom edge
{ getPoints: function(quantity, stepRate) { // output = [point0, point1, ...]; // point: Phaser.Math.Vector2, or {x, y} return output; } }
- Custom edge
quantity
: The number of particles to place on the source edge. Set to 0 to usestepRate
instead.stepRate
: The distance between each particle. When set,quantity
is implied and should be set to 0.yoyo
: Whether particles are placed from start to end and then end to start. Default isfalse
.seamless
: Whether one endpoint will be removed if it's identical to the other. Default istrue
.total
: The total number of particles this zone will emit before passing over to the next emission zone in the Emitter.
quantity or stepRate
Set emit zone¶
emitter.setEmitZone(zone);
zone
: The Emit Zone to set as the active zone.- A zone object
- A number as index
Zone source¶
- Get
// var zone = emitter.emitZones[i]; var source = zone.source;
- (Edge type only) Update points of curve source
zone.updateSource();
- (Edge type only) Set source to another curve, also update points
zone.changeSource(curve);
Remove emit zone¶
emitter.removeEmitZone(zone)
Clear emit zone¶
emitter.clearEmitZones();
emitter.emitZones.length = 0;
emitter.zoneIndex = 0;
Death zone¶
var zone = emitter.addDeathZone({
type: 'onEnter',
source: geom
});
type
:'onEnter'
or'onLeave'
source
: Geom like Circle, Ellipse, Rectangle,Triangle, Polygon- Custom
source
:{ contains: function (x, y) { // ... return bool; } }
- Custom
Remove death zone¶
emitter.removeDeathZone(zone)
Clear death zone¶
emitter.clearDeathZones();
emitter.deathZones.length = 0;
Update Configuration¶
emitter.updateConfig(config)
config
: See config parameter in constructor.
Events¶
- Starts emission of particles.
emitter.on('start', function(emitter) { })
- Explodes a set of particles.
emitter.on('explode', function(emitter, particle) { })
- Death Zone kills a Particle instance.
emitter.on('deathzone', function(emitter, particle, zone) { })
- Stops emission
emitter.on('stop', function(emitter) { })
- Directly call the
ParticleEmitter.stop
method. - Stop after a set time via the
duration
property. - Stop after a set number of particles via the
stopAfter
property.
- Directly call the
- Complete Event, no particles are still rendering at this point in time.
emitter.on('complete', function(emitter) { })
Bounds¶
- Add bounds
or
var bounds = emitter.addParticleBounds(x, y, width, height); // var bounds = emitter.addParticleBounds(x, y, width, height, collideLeft, collideRight, collideTop, collideBottom);
var bounds = emitter.addParticleBounds(rect);
x, y, width, height
,{x, y, width, height}
, or{x, y, w, h}
, or Rectangle : BoundscollideLeft
,collideRight
,collideTop
,collideBottom
: Whether particles interact with the left/right/top/bottom edge of the bounds.
- Collide edges
bounds.collideLeft = enabled; bounds.collideRight = enabled; bounds.collideTop = enabled; bounds.collideBottom = enabled;
- Bound rectangle
var rect = bounds.bounds;
rect
: Rectangle
Gravity well¶
- Create a gravity well
var well = particles.createGravityWell({ // x: 0, // y: 0, // power: 0, // epsilon: 100, // gravity: 50 });
- Enable
- Active
well.active = true;
- Inactive
well.active = false;
- Active
- Position
well.x = x; well.y = y;
- Gravity
well.gravity = value;
- Power
well.power = value;
Custom Particle Processor¶
- Declare Particle Processor class
class MyParticleProcessor extends Phaser.GameObjects.Particles.ParticleProcessor { constructor() { super(x, y, active); // ... } update(particle, delta, step, t) { // particle : The Particle to update. // delta : The delta time in ms. // step : The delta value divided by 1000. // t : The current normalized lifetime of the particle, between 0 (birth) and 1 (death). } destroy() { super.destroy(); } }
- Override
update
method
- Override
- Add to emitter
var myParticleProcessor = emitter.addParticleProcessor(new MyParticleProcessor);
Custom particle class¶
class MyParticle extends Phaser.GameObjects.Particles.Particle {
constructor (emitter) {
super(emitter);
/* ... */
}
update (delta, step, processors) {
super.update(delta, step, processors);
/* ... */
}
}
Other properties¶
See game object
Create mask¶
var mask = emitter.createBitmapMask();
See mask
Shader effects¶
Support postFX effects
Note
No preFX effect support