Skip to content

Commit 6ccb654

Browse files
committed
Particle Renderer + Basic Particle Movement
1 parent 413d50c commit 6ccb654

8 files changed

Lines changed: 497 additions & 13 deletions

File tree

v3/src/gameobjects/emitter/Particle.js

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,32 @@ var Particle = new Class({
44

55
initialize:
66

7-
function Particle ()
7+
function Particle (x, y)
88
{
9-
this.x = 0.0;
10-
this.y = 0.0;
11-
this.gravityX = 0.0;
12-
this.gravityY = 0.0;
9+
this.index = 0;
10+
this.x = x;
11+
this.y = y;
1312
this.velocityX = 0.0;
1413
this.velocityY = 0.0;
14+
this.angularVelocity = 0.0;
15+
this.rotation = 0.0;
16+
this.scaleX = 1.0;
17+
this.scaleY = 1.0;
18+
this.life = 1.0;
19+
},
20+
21+
reset: function (x, y)
22+
{
23+
this.index = 0;
24+
this.x = x;
25+
this.y = y;
26+
this.velocityX = 0.0;
27+
this.velocityY = 0.0;
28+
this.rotation = 0.0;
29+
this.scaleX = 1.0;
30+
this.scaleY = 1.0;
31+
this.life = 1.0;
32+
return this;
1533
}
1634

1735
});

v3/src/gameobjects/emitter/ParticleEmitter.js

Lines changed: 90 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var Components = require('../components');
44
var GameObject = require('../GameObject');
55
var Render = require('./ParticleEmitterRender');
66
var Particle = require('./Particle');
7+
var Between = require('../../math/Between');
8+
var StableSort = require('../../utils/array/StableSort');
79

810
var ParticleEmitter = new Class({
911

@@ -12,7 +14,6 @@ var ParticleEmitter = new Class({
1214
Mixins: [
1315
Components.Alpha,
1416
Components.BlendMode,
15-
Components.Origin,
1617
Components.RenderTarget,
1718
Components.ScrollFactor,
1819
Components.Texture,
@@ -30,19 +31,41 @@ var ParticleEmitter = new Class({
3031

3132
this.dead = [];
3233
this.alive = [];
33-
this.deadQueue = [];
34+
this.minSpeed = 0;
35+
this.maxSpeed = 0;
36+
this.minAngle = 0;
37+
this.maxAngle = 0;
38+
this.gravityX = 0;
39+
this.gravityY = 0;
40+
this.life = 1.0;
3441
this.setTexture(texture, frame);
3542
this.setPosition(x, y);
36-
this.setSizeToFrame();
37-
this.setOrigin();
43+
},
44+
45+
setSpeed: function (min, max)
46+
{
47+
this.minSpeed = min;
48+
this.maxSpeed = max;
49+
},
50+
51+
setAngle: function (min, max)
52+
{
53+
this.minAngle = min;
54+
this.maxAngle = max;
55+
},
56+
57+
setGravity: function (x, y)
58+
{
59+
this.gravityX = x;
60+
this.gravityY = y;
3861
},
3962

4063
reserve: function (particleCount)
4164
{
4265
var dead = this.dead;
43-
for (var count = 0; particleCount; ++count)
66+
for (var count = 0; count < particleCount; ++count)
4467
{
45-
dead.push(new Particle());
68+
dead.push(new Particle(this.x, this.y));
4669
}
4770
},
4871

@@ -94,9 +117,69 @@ var ParticleEmitter = new Class({
94117
}
95118
},
96119

97-
update: function (delta)
120+
emitParticle: function()
98121
{
122+
var particle = null;
123+
var rad = Between(this.minAngle, this.maxAngle) * Math.PI / 180;
124+
var vx = Math.cos(rad) * Between(this.minSpeed, this.maxSpeed);
125+
var vy = Math.sin(rad) * Between(this.minSpeed, this.maxSpeed);
126+
127+
if (this.dead.length > 0)
128+
{
129+
particle = this.dead.pop();
130+
particle.reset(this.x, this.y);
131+
}
132+
else
133+
{
134+
particle = new Particle(this.x, this.y);
135+
}
136+
137+
particle.velocityX = vx;
138+
particle.velocityY = vy;
139+
particle.life = this.life;
140+
particle.index = this.alive.length;
141+
142+
this.alive.push(particle);
143+
},
144+
145+
preUpdate: function (time, delta)
146+
{
147+
var dead = this.dead;
148+
var particles = this.alive;
149+
var length = particles.length;
150+
var step = delta / 1000;
151+
var gravityX = this.gravityX * step;
152+
var gravityY = this.gravityY * step;
153+
99154
/* Simulation */
155+
for (var index = 0; index < length; ++index)
156+
{
157+
var particle = particles[index];
158+
159+
particle.velocityX += gravityX;
160+
particle.velocityY += gravityY;
161+
particle.x += particle.velocityX * step;
162+
particle.y += particle.velocityY * step;
163+
particle.rotation += particle.angularVelocity * step;
164+
particle.life -= step;
165+
166+
if (particle.life <= 0)
167+
{
168+
let last = particles[length - 1];
169+
particles[length - 1] = particle;
170+
particles[index] = last;
171+
index -= 1;
172+
length -= 1;
173+
}
174+
}
175+
176+
/* Cleanup */
177+
var deadLength = particles.length - length;
178+
if (deadLength > 0)
179+
{
180+
dead.push.apply(dead, particles.splice(particles.length - deadLength, deadLength));
181+
StableSort(particles, function (a, b) { return a.index - b.index; });
182+
}
100183
}
101184

102185
});

v3/src/gameobjects/emitter/ParticleEmitterFactory.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@ var GameObjectFactory = require('../../scene/plugins/GameObjectFactory');
1111

1212
GameObjectFactory.register('emitter', function (x, y, key, frame)
1313
{
14-
return this.displayList.add(new ParticleEmitter(this.scene, x, y, key, frame));
14+
var emitter = new ParticleEmitter(this.scene, x, y, key, frame);
15+
16+
this.displayList.add(emitter);
17+
this.updateList.add(emitter);
18+
19+
return emitter;
1520
});

v3/src/gameobjects/emitter/ParticleEmitterWebGLRenderer.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1+
var GameObject = require('../GameObject');
2+
13
var ParticleEmitterWebGLRenderer = function (renderer, emitter, interpolationPercentage, camera)
24
{
5+
if (GameObject.RENDER_MASK !== emitter.renderFlags ||
6+
(emitter.cameraFilter > 0 &&
7+
(emitter.cameraFilter & camera._id)))
8+
{
9+
return;
10+
}
311

12+
renderer.particleRenderer.renderEmitter(emitter, camera);
413
};
514

615
module.exports = ParticleEmitterWebGLRenderer;

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var CONST = require('../../const');
1212
var EffectRenderer = require('./renderers/effectrenderer/EffectRenderer');
1313
var IsSizePowerOfTwo = require('../../math/pow2/IsSizePowerOfTwo');
1414
var QuadBatch = require('./renderers/quadbatch/QuadBatch');
15+
var ParticleRenderer = require('./renderers/particlerenderer/ParticleRenderer');
1516
var ResourceManager = require('./ResourceManager');
1617
var Resources = require('./resources');
1718
var ScaleModes = require('../ScaleModes');
@@ -167,6 +168,7 @@ var WebGLRenderer = new Class({
167168
this.effectRenderer = this.addRenderer(new EffectRenderer(this.game, gl, this));
168169
this.tileBatch = this.addRenderer(new TileBatch(this.game, gl, this));
169170
this.tilemapRenderer = this.addRenderer(new TilemapRenderer(this.game, gl, this));
171+
this.particleRenderer = this.addRenderer(new ParticleRenderer(this.game, gl, this));
170172
this.currentRenderer = this.spriteBatch;
171173
this.currentVertexBuffer = null;
172174
this.setBlendMode(0);

0 commit comments

Comments
 (0)