private Particle newParticle(Vector2 pos, float angle, Vector2 sourceVelocity) { Particle particle = new Particle(); particle.Position = pos; float directionAngle = (float)MathHelper.ToRadians((XnaHelper.RandomAngle(angle, _arc))); float speed = applyVariance(_particleSpeed, _speedVariance); particle.Velocity = speed * XnaHelper.VectorFromAngle(directionAngle); particle.Scale = applyVariance(_particleScale, _scaleVariance); particle.Angle = angle; particle.LifeTime = TimeSpan.FromSeconds(applyVariance((float)_particleLife.TotalSeconds, _particleLifeVariance)); if (Reversed) { float secondsAlive = (float)particle.LifeTime.TotalSeconds; //start at the end particle.Position = particle.Position + particle.Velocity * secondsAlive; //comment above and uncomment below for a cool effect (unintentional side effect while working on particles. //not sure why it looks so awesome, but it does) //particle.Position = particle.Position + particle.Velocity * secondsAlive * (1 - _particleDecelerationFactor); //movce in reverse particle.Velocity = Vector2.Negate(particle.Velocity); //start at end scale particle.Scale = _particleScale + _scaleRate * secondsAlive; //start at end rotation particle.Angle = _particleRotationSpeed * secondsAlive; } particle.Velocity += sourceVelocity; return(particle); }