public Path Generate(CollisionMapComponent collisionMap, IsometricMapComponent map, Point start, Point end, PathValidationHandler validation)
 {
     return(Generate(collisionMap, map, start, new List <Point>()
     {
         end
     }, validation));
 }
Exemple #2
0
        private CollisionMapComponent CreateCollisionMap(IsometricMapComponent map)
        {
            CollisionMapComponent collisions = new CollisionMapComponent();

            for (int x = 0; x < map.TxWidth; x++)
            {
                for (int y = 0; y < map.TxHeight; y++)
                {
                    if (map.Terrain[0, y, x] == (int)Tiles.Grass)
                    {
                        collisions.Map.Add(new Point(x, y), PathTypes.UNDEFINED);
                    }
                    else
                    {
                        collisions.Map.Add(new Point(x, y), PathTypes.BLOCKED);
                    }
                }
            }

            return(collisions);
        }
        public Path Generate(CollisionMapComponent collisionMap, IsometricMapComponent map, Point start, List <Point> end, PathValidationHandler validation)
        {
            // reset the lists
            _openList.Clear();
            _closedList.Clear();

            foreach (Point p in end)
            {
                if (!collisionMap.Map.ContainsKey(p))
                {
                    collisionMap.Map.Add(p, PathTypes.UNDEFINED);
                }
            }
            if (!collisionMap.Map.ContainsKey(start))
            {
                collisionMap.Map.Add(start, PathTypes.UNDEFINED);
            }

            if (collisionMap.Map[start] == PathTypes.BLOCKED)
            {
                return(new Path());
            }

            _openList.Add(start, new PathWaypoint(start));

            while (_openList.Count > 0)
            {
                int          min          = Int32.MaxValue;
                PathWaypoint selectedNode = null;

                foreach (PathWaypoint node in _openList.Values)
                {
                    int G      = node.Length;
                    int H      = MathHelper.Distance(start, node.Location);
                    int length = G + H;
                    if (length < min)
                    {
                        min          = length;
                        selectedNode = node;
                    }
                }

                _openList.Remove(selectedNode.Location);
                _closedList.Add(selectedNode.Location, selectedNode);

                foreach (Point p in end)
                {
                    if (selectedNode.Location == p)
                    {
                        return(new Path(selectedNode, start, p, true));
                    }
                }

                for (int x = -1; x < 2; x++)
                {
                    for (int y = -1; y < 2; y++)
                    {
                        if (x != 0 && y != 0)
                        {
                            continue;
                        }

                        // no diags or self
                        if (x == y || x == -y || -x == y)
                        {
                            continue;
                        }

                        if (!map.IsValidIndex(selectedNode.Location.X + x, selectedNode.Location.Y + y))
                        {
                            continue;
                        }

                        Point p = new Point(selectedNode.Location.X + x, selectedNode.Location.Y + y);
                        if (!collisionMap.Map.ContainsKey(p))
                        {
                            collisionMap.Map.Add(p, PathTypes.UNDEFINED);
                        }

                        PathWaypoint waypoint = new PathWaypoint(
                            p,
                            (int)collisionMap.Map[p],
                            selectedNode
                            );

                        if (validation(waypoint.Location) && !_closedList.ContainsKey(waypoint.Location))
                        {
                            if (_openList.ContainsKey(waypoint.Location))
                            {
                                if (_openList[waypoint.Location].Length > waypoint.Length)
                                {
                                    _openList[waypoint.Location].SetParent(waypoint.Parent);
                                }
                            }
                            else
                            {
                                _openList.Add(waypoint.Location, waypoint);
                            }
                        }
                    }
                }
            }

            return(new Path());
        }