Example #1
0
        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();
        }