public void Update(float frameTime) { Age += frameTime; if (Age >= Lifetime) { Alive = false; } Velocity += Acceleration * frameTime; RadialVelocity += RadialAcceleration * frameTime; TangentialVelocity += TangentialAcceleration * frameTime; //Calculate delta p due to radial velocity var positionRelativeToEmitter = Position - EmitterPosition; var deltaRadial = RadialVelocity * frameTime; var deltaPosition = positionRelativeToEmitter * (deltaRadial / positionRelativeToEmitter.Length); //Calculate delta p due to tangential velocity var radius = positionRelativeToEmitter.Length; if (radius > 0) { var theta = MathUtility.ATan(positionRelativeToEmitter.Y, positionRelativeToEmitter.X); theta += TangentialVelocity * frameTime; deltaPosition += new Vector2D(radius * MathUtility.Cos(theta), radius * MathUtility.Sin(theta)) - positionRelativeToEmitter; } //Calculate delta p due to Velocity deltaPosition += Velocity * frameTime; Position += deltaPosition; Spin += SpinVelocity * frameTime; Size += SizeDelta * frameTime; Color += ColorDelta * frameTime; }