示例#1
0
文件: Grid.cs 项目: bmjoy/Osnowa
        public Grid(IOsnowaContextManager contextManager, bool contextShouldBePresent = false)
        {
            if (!contextManager.HasContext)
            {
                if (contextShouldBePresent)
                {
                    throw new ArgumentException("Missing context where it's expeteced to be present");
                }
            }
            else
            {
                _positionFlags         = contextManager.Current.PositionFlags;
                _walkability           = contextManager.Current.Walkability;
                _pathfindingDataHolder = contextManager.Current.PathfindingData;
            }

            contextManager.ContextReplaced += newContext =>
            {
                _positionFlags         = newContext.PositionFlags;
                _walkability           = newContext.Walkability;
                _pathfindingDataHolder = newContext.PathfindingData;
            };
            MinPosition = Position.Zero;

            _passingLightFlagAsUlong = Convert.ToUInt64(PositionFlag.PassingLight);
        }
示例#2
0
 public OsnowaContext(int xSize, int ySize)
 {
     PositionFlags       = new PositionFlags(xSize, ySize);
     PathfindingData     = new PathfindingDataHolder(xSize, ySize);
     TileMatricesByLayer = new MatrixByte[(int)TilemapLayer.TotalLayersCount];
     Walkability         = new MatrixFloat(xSize, ySize);
     for (int i = 0; i < TileMatricesByLayer.Length; i++)
     {
         TileMatricesByLayer[i] = new MatrixByte(xSize, ySize);
     }
     VisibleEntities = new HashSet <IPositionedEntity>();
 }
示例#3
0
        public void FindJumpPointsWithJps_IntegrationTest_AllGridIsWalkable_ReturnsCorrectPath(int xOffset, int yOffset)
        {
            /* Illustration:
             * ........
             * ...jt...
             * ..sj....
             * ........*/

            Position minPositionInUnityGrid = new Position(-10, -10);
            int      unityGridXSize         = 20;
            int      unityGridYSize         = 20;
            Position offset                             = new Position(xOffset, yOffset);
            var      startPosition                      = new Position(0, 0) + offset;
            var      targetPosition                     = new Position(2, 1) + offset;
            var      expectedMiddleJumpPoint            = new Position(1, 1) + offset;
            var      expectedAlternativeMiddleJumpPoint = new Position(1, 0) + offset;
            PathfindingDataHolder pathfindingData       = new PathfindingDataHolder(unityGridXSize, unityGridYSize);

            for (int x = 0; x < unityGridXSize; x++)
            {
                for (int y = 0; y < unityGridYSize; y++)
                {
                    var position = new Position(x, y);
                    pathfindingData.UpdateWalkability(position, true);
                }
            }
            var contextManager = Mock.Of <IOsnowaContextManager>(m => m.Current.PathfindingData == pathfindingData);

            IRasterLineCreator bresenham = new BresenhamLineCreator();
            var pathfinder = new Pathfinder(contextManager, new NaturalLineCalculator(bresenham), bresenham);

            IList <Position> jumpPoints = pathfinder.FindJumpPointsWithJps(startPosition, targetPosition).Positions;
            IList <Position> jumpPointsFromSpatialAstar = pathfinder.FindJumpPointsWithSpatialAstar(startPosition, targetPosition).Positions;

            jumpPoints.Count.Should().Be(3);
            jumpPoints[0].Should().Be(startPosition);
            (jumpPoints[1] == expectedMiddleJumpPoint || jumpPoints[1] == expectedAlternativeMiddleJumpPoint).Should().BeTrue();
            jumpPoints[2].Should().Be(targetPosition);

            jumpPointsFromSpatialAstar.Count.Should().Be(3);
            jumpPointsFromSpatialAstar[0].Should().Be(startPosition);
            (jumpPointsFromSpatialAstar[1] == expectedMiddleJumpPoint ||
             jumpPointsFromSpatialAstar[1] == expectedAlternativeMiddleJumpPoint).Should().BeTrue();
            jumpPointsFromSpatialAstar[2].Should().Be(targetPosition);
        }