public void update(float timeElapsed) { _delayRemaining -= timeElapsed; _position += _velocity * timeElapsed; if (isDone) { _em.showExplosion(_explParams, _intensity, _position, _velocity); } }
public void update(float timeElapsed) { _position += _velocity * timeElapsed; _timeElapsedTotal += timeElapsed; for (int i = 0; i < _delaysRemaining.Length; ++i) { if (_explosionsRemaining > 0 && _delaysRemaining [i] <= 0f) { float intensity = _chainParams.minIntensity + (float)rand.NextDouble() * (_chainParams.maxIntensity - _chainParams.minIntensity); double r = _chainParams.radiusMin + rand.NextDouble() * (_chainParams.radiusMax - _chainParams.radiusMin); double theta = 2.0 * Math.PI * rand.NextDouble(); double phi = Math.PI * (rand.NextDouble() - 0.5); double xy = r * Math.Cos(theta); Vector3 radialOffset = new Vector3( (float)(xy * Math.Cos(theta)), (float)(xy * Math.Sin(theta)), (float)(r * Math.Sin(phi))); Vector3 pos = _position + radialOffset; double spreadVelScale = _chainParams.spreadVelocityMin + rand.NextDouble() * (_chainParams.spreadVelocityMax - _chainParams.spreadVelocityMin); Vector3 vel = _velocity; if (radialOffset.LengthFast > 0f) { var radialDir = radialOffset.Normalized(); var radialVelOffset = (float)spreadVelScale * radialDir; pos += radialVelOffset * _timeElapsedTotal; vel += radialVelOffset; } _em.showExplosion(_chainParams, intensity, pos, vel); _delaysRemaining [i] = _chainParams.minDelay + (float)rand.NextDouble() * (_chainParams.maxDelay - _chainParams.minDelay); --_explosionsRemaining; } _delaysRemaining [i] -= timeElapsed; } }