update method

  1. @override
void update(
  1. double dt
)
override

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();
  }
}