public void LoadNpcCars(World world, IList<Car> list, int quantity, Texture2D[] textures)
        {
            list.Clear(); //Delete any existing cars in operation
            var rand = new Random();
            var laneNum = 0;

            for(var i = 0; i < quantity; i++)
            {
                var spawnAttempts = 0;
                var textureId = rand.Next(0, textures.Count()-1);

                var newCar = new Car(textures[textureId]);
                world.InitializeNpcCar(newCar, laneNum, ref rand);
                world.OptimizeSpawnPosition(this, list, newCar, laneNum, ref rand, ref spawnAttempts);

                //If the car did not hit its number of maximum spawn attempts, assume it safe-spawned and spawn it
                if(spawnAttempts <= World.MaxSpawnAttempts)
                {
                    list.Add(newCar);
                    laneNum++;
                    if (laneNum >= world.Lanes.Count())
                        laneNum = 0;
                }

            }
        }
        /// <summary>
        /// Checks a given area against all NPCs in order to find a collision - event terminates on the first collision in case there's more than one.
        /// </summary>
        /// <param name="cars"></param>
        /// <param name="toCheck">the area to check for a collision</param>
        /// <param name="collided">a reference to the car that collided with the given rectangle</param>
        /// <returns>true or false</returns>
        public bool CheckNpcHardCollision(IList<Car> cars, Rectangle toCheck, out Car collided)
        {
            foreach (var car in cars.Where(car => car.HardCollisionBoundary.Intersects(toCheck) && car.IsColliding == false))
            {
                collided = car;
                return true;
            }

            collided = null;
            return false;
        }
 public void InitializePcCar(Car car)
 {
     var laneNum = Lanes.Count() / 2;
     car.Center = new Vector2((Lanes[laneNum].LaneBox.X + (Lanes[laneNum].LaneBox.Width - car.Width) / 2f), Bounds.Height - car.Height);
     car.Velocity = new Vector2(0f, -10f);
 }
        /// <summary>
        /// Recursively looks for an optimal place to spawn an NPC car where it won't collide with any other NPCs
        /// </summary>
        /// <param name="pcCar"></param>
        /// <param name="list"></param>
        /// <param name="car">The car we intend to spawn</param>
        /// <param name="laneNum">the lane on the freeway the car belongs to</param>
        /// <param name="rand">a random number generator we pass by reference</param>
        /// <param name="attemptCount">the number of attempts it has taken us to spawn this car</param>
        public void OptimizeSpawnPosition(PcCar pcCar, IList<Car> list, Car car, int laneNum, ref Random rand, ref int attemptCount)
        {
            Car collisionCar;

            if ((CheckNpcHardCollision(list, car.SoftCollisionBoundary, out collisionCar)
                    || pcCar.SoftCollisionBoundary.Intersects(car.HardCollisionBoundary)
                ) && attemptCount <= MaxSpawnAttempts)
            {

                /* All of this code needs to execute whenever an NPC car has:
                 *  1. Spawned on top of another NPC
                 *  2. Spawned on top of the PC
                 *  3. And the maxmimum number of spawn attempts has not been reached.
                */

                attemptCount++;
                InitializeNpcCar(car, laneNum, ref rand);
                OptimizeSpawnPosition(pcCar, list, car, laneNum, ref rand, ref attemptCount);
            }
        }
 public void InitializeNpcCar(Car car, int laneNum, ref Random rand)
 {
     var yPos = rand.Next(0, Bounds.Height - car.Height);
     var velocity = (rand.Next(-45, 45) + 0.5f);
     car.Center = new Vector2((Lanes[laneNum].LaneBox.X + (Lanes[laneNum].LaneBox.Width - car.Width) / 2f), yPos);
     car.Velocity = new Vector2(0f, velocity);
 }