Esempio n. 1
0
        /// <summary>
        /// Processes the grid southwards and assigns all distances per tile in the southward direction.
        /// </summary>
        private void ProcessGridSouthwards(NavTileSurfaceData inData)
        {
            int currentDistance = 0;

            RectInt gridBounds = inData.GridBounds.AsRect();

            Vector2Int coordinate = new Vector2Int();

            for (coordinate.x = gridBounds.xMin; coordinate.x <= gridBounds.xMax; coordinate.x++)
            {
                for (coordinate.y = gridBounds.yMin; coordinate.y <= gridBounds.yMax; coordinate.y++)
                {
                    TileData tile = inData.GetTileData(coordinate);

                    if (tile == null)
                    {
                        continue;
                    }

                    AdditionalJPSPlusData addedData = tile.AdditionalData;

                    if (coordinate.y == gridBounds.yMin ||
                        !inData.IsTileWalkable(coordinate + new Vector2Int(0, -1), 1))
                    {
                        addedData.SetJumpDistance(JumpPointDirection.South, 0);
                    }
                    else if (inData.IsTileWalkable(coordinate + new Vector2Int(0, -1), 1) &&
                             (inData.GetTileData(coordinate + new Vector2Int(0, -1))?.AdditionalData.GetJumpDistance(JumpPointDirection.West) > 0 ||
                              inData.GetTileData(coordinate + new Vector2Int(0, -1))?.AdditionalData.GetJumpDistance(JumpPointDirection.East) > 0))
                    {
                        addedData.SetJumpDistance(JumpPointDirection.South, 1);
                    }
                    else
                    {
                        currentDistance = inData.GetTileData(coordinate + new Vector2Int(0, -1)).AdditionalData.GetJumpDistance(JumpPointDirection.South);

                        if (currentDistance > 0)
                        {
                            addedData.SetJumpDistance(JumpPointDirection.South, currentDistance + 1);
                        }
                        else
                        {
                            addedData.SetJumpDistance(JumpPointDirection.South, currentDistance - 1);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Processes the grid westwards and assigns all distances per tile in the westward direction.
        /// </summary>
        private void ProcessGridWestwards(NavTileSurfaceData inData)
        {
            int      currentDistance = 0;
            TileData relevantTile    = null;

            RectInt gridBounds = inData.GridBounds.AsRect();

            Vector2Int coordinate = new Vector2Int();

            for (coordinate.x = gridBounds.xMin, coordinate.y = gridBounds.yMin; coordinate.x < gridBounds.xMax && coordinate.y < gridBounds.yMax; coordinate.y++)
            {
                for (; coordinate.x < gridBounds.xMax; coordinate.x++)
                {
                    TileData currentTile = inData.GetTileData(coordinate);

                    SetDistance(JumpPointDirection.West, currentTile, ref relevantTile, ref currentDistance);
                }

                coordinate.x    = gridBounds.xMin;
                relevantTile    = null;
                currentDistance = 0;
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Checks the grid and marks any jump point.
        /// </summary>
        private void IdentifyJumpPoint(KeyValuePair <Vector2Int, TileData> inTile, NavTileSurfaceData inData)
        {
            JumpPointDirection jumpPointFlag = JumpPointDirection.None;

            if (inTile.Value == null || !inTile.Value.IsWalkable(1))
            {
                return;
            }

            // Hard coded 0 to 3 as there are only 4 cardinal directions.
            for (int i = 0; i <= 3; i++)
            {
                JumpPointDirection parentDirection = (JumpPointDirection)(1 << i);
                Vector2Int         parentPosition  = GetNextPositionInDirection(inTile.Key, parentDirection);

                TileData parentTile = inData.GetTileData(parentPosition);

                if (parentTile == null || !parentTile.IsWalkable(1))
                {
                    continue;
                }

                JumpPointDirection firstPerpendicularDirection;
                JumpPointDirection secondPerpendicularDirection;

                GetPerpendicularDirections(parentDirection, out firstPerpendicularDirection, out secondPerpendicularDirection);

                if ((HasAdjacentTraverseNode(inTile.Key, firstPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, firstPerpendicularDirection, inData)) ||
                    HasAdjacentTraverseNode(inTile.Key, secondPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, secondPerpendicularDirection, inData))
                {
                    jumpPointFlag |= GetOppositeDirection(parentDirection);
                }
            }

            (inTile.Value.AdditionalData as AdditionalJPSPlusData).JumpPointDirections = jumpPointFlag;
        }