Example #1
0
    public Vector2[] Navigate(Vector2 start, Vector2 end)
    {
        var startTile = new WeightedTile()
        {
            Position = start
        };
        var closedList = new List <WeightedTile>();
        var openList   = new List <WeightedTile>()
        {
            startTile
        };

        while (openList.Any())
        {
            var quickestTile = openList.OrderBy(t => t.Weight).First();
            if (quickestTile.Position == end)              // We're done! Found the path.
            {
                return(FindPath(startTile, quickestTile));
            }

            openList.Remove(quickestTile);
            closedList.Add(quickestTile);
            foreach (var neighbor in _searchableDirections.Select(d => d.ToVector2())
                     .Select(d => quickestTile.Position + d)
                     .Where(d => IsTraversable(d)))
            {
                if (closedList.Any(c => c.Position == neighbor))
                {
                    continue;
                }

                var movementCost = Mathf.RoundToInt(
                    Mathf2.DistanceTo(neighbor, startTile.Position)
                    + quickestTile.MovementCost);

                var existingNeighbor = openList.FirstOrDefault(o => o.Position == neighbor);
                if (existingNeighbor == null)
                {
                    openList.Add(new WeightedTile()
                    {
                        MovementCost = movementCost,
                        Heuristic    = Mathf.RoundToInt(Mathf2.DistanceTo(neighbor, end)),
                        Parent       = quickestTile,
                        Position     = neighbor
                    });
                }
                else if (existingNeighbor.MovementCost > movementCost)
                {
                    existingNeighbor.MovementCost = movementCost;
                    existingNeighbor.Parent       = quickestTile;
                }
            }
        }

        return(new Vector2[0]);
    }