2021SC@SDUSC
(接上文)
目录
updateParticles: function(deltaTime) {
deltaTime /= 1000;
this._elapsedTime += deltaTime;
var particles = this._particles;
if (this._emitting) {
for (var i = 0; i < this._emitters.length; i++) {
this._emitters[i].emit(particles);
}
if (this.oneshot) {
this._emitting = false;
}
}
var len = particles.length;
for (var i = 0; i < len;) {
var p = particles[i];
p.age += deltaTime;
if (p.age >= p.life) {
p.emitter.kill(p);
particles[i] = particles[len-1];
particles.pop();
len--;
} else {
i++;
}
}
for (var i = 0; i < len; i++) {
// Update
var p = particles[i];
if (this._fields.length > 0) {
for (var j = 0; j < this._fields.length; j++) {
this._fields[j].applyTo(p.velocity, p.position, p.weight, deltaTime);
}
}
p.update(deltaTime);
}
this._updateVertices();
},
参数为增量时间deltaTime;
deltaTime /= 1000;
1000应为秒、毫秒之间的转换,将以毫秒为参考的deltaTime转化为秒对应的增量时间;
this._elapsedTime += deltaTime;
接着令消逝时间加上该部分时间;
var particles = this._particles;
定义particles获取_particles;
if (this._emitting) {
for (var i = 0; i < this._emitters.length; i++) {
this._emitters[i].emit(particles);
}
if (this.oneshot) {
this._emitting = false;
}
}
判断是否处于可发射状态;
若处于可发射状态,则使用_emitters中所有发射器发射particles中的粒子;
接着,若是该渲染为一次性的,则将可发射状态设为false;
var len = particles.length;
接着定义粒子总数量len;
for (var i = 0; i < len;) {
var p = particles[i];
p.age += deltaTime;
if (p.age >= p.life) {
p.emitter.kill(p);
particles[i] = particles[len-1];
particles.pop();
len--;
} else {
i++;
}
}
这部分用于更新粒子年龄和检测处理超龄粒子:
对于每一个粒子,令粒子年龄增加增量时间,然后判断粒子年龄是否已经到达或超过其最大寿命;
若是,则用kill()将该粒子放回粒子池,用队尾粒子替换该位置粒子,移除队尾粒子,更新长度;
否则,更新并检测下一粒子。
for (var i = 0; i < len; i++) {
var p = particles[i];
if (this._fields.length > 0) {
for (var j = 0; j < this._fields.length; j++) {
this._fields[j].applyTo(p.velocity, p.position, p.weight, deltaTime);
}
}
p.update(deltaTime);
}
之后,对于所有还在其生命周期内的粒子,检测其领域总数(即是否有受到力的影响),若有,则对粒子应用所有领域,之后更新粒子的位置和方向。
this._updateVertices();
最后调用_updateVertices(),该部分将在下篇分析。
(待续)