Esempio n. 1
0
 public bool FindPath(int startX, int startY, MapPos finalPos, OnPathCallback callback)
 {
     return(FindPath(startX, startY, new List <MapPos>()
     {
         finalPos
     }, callback));
 }
Esempio n. 2
0
    public bool FindPath(int startX, int startY, List <MapPos> finalPositions, OnPathCallback callback)
    {
        var width  = widthMax;
        var height = heightMax;

        var start = GetClosestValidPos(startX, startY);

        startX = start.x;
        startY = start.y;
        var paths = new List <PathRoute>();

        foreach (var finalPos in finalPositions)
        {
            if (startX < 0 || startY < 0 || finalPos.x < 0 || finalPos.y < 0 ||
                startX >= width || finalPos.x >= width ||
                startY >= height || finalPos.y >= height)
            {
                continue; // Out of bounds!
            }
            if (mapNodes[finalPos.x][finalPos.y].weight == WALL_WEIGHT ||
                mapNodes[startX][startY].weight == WALL_WEIGHT) // Find close non-wall start/end
            {
                continue;                                       // Wall
            }
            var currentPath = findPath(startX, startY, finalPos.x, finalPos.y);
            if (currentPath.Count <= 0 && (startX != finalPos.x || startY != finalPos.y))
            {
                // Don't add path if there's no path
            }
            else
            {
                if (!finalPos.straightToOffset) // Don't go straight to offset, add dummy
                {
                    currentPath.Add(currentPath[currentPath.Count - 1]);
                }

                paths.Add(new PathRoute(currentPath, worldOrigin, nodeSize, finalPos));
            }
        }

        var smallest = 0;

        for (var i = 1; i < paths.Count; i++)
        {
            if (paths[i].pathNodeList.Count < paths[smallest].pathNodeList.Count)
            {
                smallest = i;
            }
        }

        if (paths.Count <= 0 || paths.Count > 0 && paths[smallest].pathNodeList.Count <= 0) // No path
        {
            return(false);
        }
        callback(paths[smallest].pathNodeList, paths[smallest].finalPos);

        return(true);
    }