Esempio n. 1
0
    public int FindContainingNode(int x, int y)
    {
        for (int i = 0; i < NumNodes; ++i)
        {
            WaypointAStarNode n = _nodes[i];
            if (x >= n.x && x < n.x + n.size && y >= n.y && y < n.y + n.size)
            {
                return(i);
            }
        }

        return(-1);
    }
Esempio n. 2
0
    public void LoadFromTileMap(TileMap tileMap, int nodeSizeX, int nodeSizeY)
    {
        List <WaypointAStarNode> genNodes = new List <WaypointAStarNode>();

        int width  = (tileMap.Width + nodeSizeX - 1) / nodeSizeX;
        int height = (tileMap.Height + nodeSizeY - 1) / nodeSizeY;

        int[] cover = new int[width * height];

        int index = 0;

        for (int y = 0; y < height; ++y)
        {
            for (int x = 0; x < width; ++x, ++index)
            {
                cover[index] = (IsPassable(tileMap, x * nodeSizeX, y * nodeSizeY, nodeSizeX, nodeSizeY) ? 0 : -1);
            }
        }

        int nodeCount = 0;

        index = 0;
        while (index < width * height)
        {
            if (cover[index] == 0)
            {
                int x = index % width;
                int y = index / width;

                ++nodeCount;
                cover[index] = nodeCount;
                int size = 1;
                while (x + size < width && y + size < height)
                {
                    bool passable = true;

                    for (int i = 0; i <= size && passable; ++i)
                    {
                        if (cover[x + i + (y + size) * width] != 0 || cover[x + size + (y + i) * width] != 0)
                        {
                            passable = false;
                        }
                    }

                    if (passable)
                    {
                        for (int i = 0; i <= size; ++i)
                        {
                            cover[x + i + (y + size) * width] = cover[x + size + (y + i) * width] = nodeCount;
                        }
                        ++size;
                    }
                    else
                    {
                        break;
                    }
                }
                WaypointAStarNode node = new WaypointAStarNode();
                node.x         = x;
                node.y         = y;
                node.size      = size;
                node.neighbors = new List <int>();
                genNodes.Add(node);
            }
            ++index;
        }

        for (int i = 0; i < genNodes.Count; ++i)
        {
            WaypointAStarNode a = genNodes[i];
            int llax            = a.x - 1;
            int llay            = a.y - 1;
            int urax            = a.x + a.size;
            int uray            = a.y + a.size;
            for (int j = i + 1; j < genNodes.Count; ++j)
            {
                WaypointAStarNode b = genNodes[j];
                int llbx            = b.x;
                int llby            = b.y;
                int urbx            = b.x + b.size - 1;
                int urby            = b.y + b.size - 1;

                if (llax <= urbx && llay <= urby && urax >= llbx && uray >= llby)
                {
                    genNodes[i].neighbors.Add(j);
                    genNodes[j].neighbors.Add(i);
                }
            }
        }

        _nodes = genNodes.ToArray();
    }