update method
Called before a frame is drawn.
Override this method to do any updates to the node or node tree before it's drawn to screen.
// Make the node rotate at a fixed speed
void update(double dt) {
rotation = rotation * 10.0 * dt;
}
Implementation
@override
void update(double dt) {
// TODO: Fix this (it's a temp fix for low framerates)
if (dt > 0.1) dt = 0.1;
// Create new particles
double rate = 1.0 / emissionRate;
if (_particles.length < maxParticles) {
_emitCounter += dt;
}
while (_particles.length < maxParticles &&
_emitCounter > rate &&
(numParticlesToEmit == 0 ||
_numEmittedParticles < numParticlesToEmit!)) {
// Add a new particle
_addParticle();
_emitCounter -= rate;
}
// _elapsedTime += dt;
// Iterate over all particles
for (int i = _particles.length - 1; i >= 0; i--) {
_Particle particle = _particles[i];
// Manage life time
particle.timeToLive -= dt;
if (particle.timeToLive <= 0) {
_particles.removeAt(i);
continue;
}
// Update the particle
if (particle.accelerations != null) {
// Radial acceleration
Vector2 radial;
if (particle.pos[0] != 0 || particle.pos[1] != 0) {
radial = Vector2.copy(particle.pos)..normalize();
} else {
radial = Vector2.zero();
}
Vector2 tangential = Vector2.copy(radial);
radial.scale(particle.accelerations!.radialAccel);
// Tangential acceleration
double newY = tangential.x;
tangential.x = -tangential.y;
tangential.y = newY;
tangential.scale(particle.accelerations!.tangentialAccel);
// (gravity + radial + tangential) * dt
final Vector2 accel = (_gravity! + radial + tangential)..scale(dt);
particle.dir += accel;
} else if (_gravity![0] != 0.0 || _gravity![1] != 0) {
// gravity
final Vector2 accel = _gravity!.clone()..scale(dt);
particle.dir += accel;
}
// Update particle position
particle.pos[0] += particle.dir[0] * dt;
particle.pos[1] += particle.dir[1] * dt;
// Size
particle.size = math.max(particle.size + particle.deltaSize * dt, 0.0);
// Angle
particle.rotation += particle.deltaRotation * dt;
// Color
if (particle.simpleColorSequence != null) {
for (int i = 0; i < 4; i++) {
particle.simpleColorSequence![i] +=
particle.simpleColorSequence![i + 4] * dt;
}
} else {
particle.colorPos =
math.min(particle.colorPos + particle.deltaColorPos * dt, 1.0);
}
}
if (autoRemoveOnFinish && _particles.isEmpty && _numEmittedParticles > 0) {
if (parent != null) removeFromParent();
}
}