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); }
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>(); }
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); }