private void Simulate(uint entity) { CPosition position = (CPosition)positions[entity]; CKinetic kinetic = (CKinetic)kinetics[entity]; kinetic.Accumulator += (float)(Engine.TotalGameTime - kinetic.LastUpdate).TotalSeconds; kinetic.LastUpdate = new TimeSpan(Engine.TotalGameTime.Ticks); while (kinetic.Accumulator >= target) { Integrate(position, kinetic, integrator, target); kinetic.Accumulator -= target; } }
private void Integrate(CPosition position, CKinetic kinetic, Integrator integrator, float deltaTime) { switch (integrator) { case Integrator.SemiImplictEuler: kinetic.Velocity += kinetic.Acceleration * deltaTime; position.X += kinetic.Velocity.X * deltaTime; position.Y += kinetic.Velocity.Y * deltaTime; break; case Integrator.VelocityVerlet: position.X += kinetic.Velocity.X * deltaTime + 0.5f * kinetic.Acceleration.X * deltaTime * deltaTime; position.Y += kinetic.Velocity.Y * deltaTime + 0.5f * kinetic.Acceleration.Y * deltaTime * deltaTime; kinetic.Velocity += kinetic.Acceleration * deltaTime; break; } }