public MovementAI(SpritePolygon collisionPolygon, Enemy parent) { nodeMap = NodeMapRepository.GetNodeMap(collisionPolygon); pathFinder = new PathFinder(); this.parent = parent; sightRange = 50; }
public static NodeMap CreateFromTileMap(TileMap tileMap, SpritePolygon collisionPolygon) { NodeMap nodeMap = new NodeMap(tileMap.MapWidthTiles, tileMap.MapHeightTiles, tileMap.TileHeight, tileMap.TileWidth); nodeMap.generationPolygon = (SpritePolygon)collisionPolygon.Clone(); for (int i = 0; i < nodeMap.XSize; i++) { for (int j = 0; j < nodeMap.YSize; j++) { Vector2 position = new Vector2 { X = nodeMap.Nodes[i, j].X, Y = nodeMap.Nodes[i, j].Y }; collisionPolygon.MoveTo(position); Collision collision = tileMap.CheckCollisionWithTerrain(collisionPolygon); if (collision == Collision.Solid || collision == Collision.Water) { nodeMap.Nodes[i, j].IsFree = false; nodeMap.Nodes[i, j].IsTerrain = true; } } } return(nodeMap); }
public static NodeMap GetNodeMap(SpritePolygon collisionPolygon) { var polygon = (SpritePolygon)collisionPolygon.Clone(); polygon.MoveTo(Vector2.Zero); if (nodeMaps.TryGetValue(polygon, out NodeMap nodeMap)) { return(nodeMap); } var map = NodeMap.CreateFromTileMap(GameState.TileMap, polygon); polygon.MoveTo(Vector2.Zero); nodeMaps.Add(polygon, map); return(map); }
public List <Node> FindPath(Node start, Node goal, NodeMap nodeMap) { PriorityQueue <Node> openSet = new PriorityQueue <Node>(); List <Node> closeSet = new List <Node>(); start.FScore = HeuristicCost(start, goal); start.GScore = 0; openSet.Enqueue(start); Node current = null; while (openSet.Count > 0) { current = openSet.Dequeue(); if (current == goal) { return(ReconstructPath(current)); } closeSet.Add(current); foreach (var neighbour in nodeMap.GetNeighbours(current.I, current.J)) { if (closeSet.Contains(neighbour)) { continue; } if (!openSet.Contains(neighbour)) { openSet.Enqueue(neighbour); } float tentativeGScore = current.GScore + HeuristicCost(current, neighbour) * neighbour.neighbourDist; if (tentativeGScore >= neighbour.GScore) { continue; } neighbour.CameFrom = current; neighbour.GScore = tentativeGScore; neighbour.FScore = neighbour.GScore + HeuristicCost(neighbour, goal); } } return(null); }