Exemple #1
0
        public virtual NavigationData GetNavigationData(Position startPosition, Position targetPosition)
        {
            if (!_grid.IsWalkable(targetPosition))
            {
                return(null);
            }

            var navigationData = new NavigationData
            {
                Destination = targetPosition,
                RemainingStepsInCurrentSegment = new Stack <Position>(),
                LastStep = startPosition
            };

            if (startPosition == targetPosition)
            {
                return(navigationData);
            }

            IList <Position> line = _rasterLineCreator.GetRasterLinePermissive(startPosition.x, startPosition.y, targetPosition.x,
                                                                               targetPosition.y, _grid.IsWalkable);

            bool rasterLineReachesTarget = line.Last() == targetPosition;

            if (rasterLineReachesTarget)
            {
                _debugPathPresenter.PresentStraight(line);
                // performance: if GetRasterLinePermissive returned a stack, we wouldn't need to allocate memory for the list
                navigationData.RemainingNodes = new[] { targetPosition }.ToList();
                return(navigationData);
            }

            PathfindingResponse result = _pathfinder.FindJumpPointsWithJps(startPosition, targetPosition);

            if (result.Result != PathfindingResult.Success)
            {
                return(null);
            }
            IEnumerable <Position> naturalJumpPoints = _naturalLineCreator.GetNaturalJumpPoints(result.Positions).Skip(1);

            navigationData.RemainingNodes = naturalJumpPoints.ToList();
            _debugPathPresenter.PresentNonStraight(navigationData.RemainingNodes);

            return(navigationData);
        }