@@ -4,6 +4,8 @@ var Components = require('../components');
44var GameObject = require ( '../GameObject' ) ;
55var Render = require ( './ParticleEmitterRender' ) ;
66var Particle = require ( './Particle' ) ;
7+ var Between = require ( '../../math/Between' ) ;
8+ var StableSort = require ( '../../utils/array/StableSort' ) ;
79
810var 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} ) ;
0 commit comments