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); }
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(); }