public void Update(float[] rayCollisions, float deltaT) { IsRunning = CheckpointManager.Update(Position); var output = Ai.GetOutput(rayCollisions, Position, Heading, CheckpointManager.CurrentWaypoint); var acceleration = Math.Min(output.Acceleration, 1); acceleration = Math.Max(acceleration, -1); var braking = Math.Min(output.BreakingForce, 1); braking = Math.Max(braking, -1); acceleration *= CarConfiguration.AccelerationCoefficient; braking *= CarConfiguration.BrakeCoefficient; // Apply acceleration Speed += acceleration - braking; // Apply drag Speed -= Speed * DragCoefficient; if (Speed < 0) { IsRunning = false; } // Cap max speed Speed = Math.Min(Speed, MaximumForwardSpeed); Speed = Math.Max(Speed, MaximumReverseSpeed); var turningForce = -output.LeftTurnForce + output.RightTurnForce; turningForce = Math.Min(turningForce, 1); turningForce = Math.Max(turningForce, -1); Heading += MaximumRads * deltaT * turningForce; Position.X += (float)Math.Cos(Heading + 1.5708) * Speed * deltaT; Position.Y += (float)Math.Sin(Heading + 1.5708) * Speed * deltaT; Sprite.Position = Position; Sprite.Rotation = Heading; if (GetDistance(StartPosition, Position) > 300) { ExitedStartArea = true; } if (IsRunning) { var distance = GetDistance(Position, previousPosition); TotalDistance += distance; TimeAlive += deltaT; PreviousSpeeds.Add(distance / deltaT); if (PreviousSpeeds.Count() > 180) { PreviousSpeeds.Remove(PreviousSpeeds.First()); } Ai.IncrementFitness(this); previousPosition = Position; } UpdateRayCasts(); }