Exemplo n.º 1
0
 public MovementAI(SpritePolygon collisionPolygon, Enemy parent)
 {
     nodeMap     = NodeMapRepository.GetNodeMap(collisionPolygon);
     pathFinder  = new PathFinder();
     this.parent = parent;
     sightRange  = 50;
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }