private void UpdateCarEvaluation(SensorCar car) { if (raceCars[car] < checkpoints.Count - 1) { Checkpoint checkpointToReach = checkpoints[raceCars[car] + 1]; double distanceToCheckpoint = car.GlobalPosition.DistanceTo(checkpointToReach.GlobalPosition); if (distanceToCheckpoint < distanceThreshold) { raceCars[car] = raceCars[car] + 1; GD.Print("Car " + car.Name + " reached checkpoint " + raceCars[car]); lastCheckpointTimestamp[car] = System.Environment.TickCount; } double currentScore; if (raceCars[car] == checkpoints.Count - 1) { currentScore = checkpoints[raceCars[car]].Score; } else { Checkpoint currentCheckpoint = checkpoints[raceCars[car]]; checkpointToReach = checkpoints[raceCars[car] + 1]; double distanceBetweenCheckpoints = currentCheckpoint.GlobalPosition.DistanceTo(checkpointToReach.GlobalPosition); distanceToCheckpoint = car.GlobalPosition.DistanceTo(checkpointToReach.GlobalPosition); currentScore = checkpoints[raceCars[car]].Score + (distanceBetweenCheckpoints - distanceToCheckpoint); } car.Agent.Genotype.Evaluation = Math.Max(0, currentScore); } }
private void LoadCars(Node parent, string carScenePath, int carsNumber) { for (int i = 0; i < carsNumber; i++) { var carScene = (PackedScene)ResourceLoader.Load(carScenePath); SensorCar car = (SensorCar)carScene.Instance(); raceCars.Add(car, 0); lastCheckpointTimestamp.Add(car, 0); CallDeferred("AddCar", parent, car); } }
private void AddCar(Node parent, SensorCar car) { parent.AddChild(car); car.GlobalPosition = checkpoints[0].GlobalPosition; }