コード例 #1
0
        private void GenerateNeighbors()
        {
            for (i = -1; i <= 1; i++)
            {
                checkX = gridX + i;
                if (checkX >= 0 && checkX < GridManager.NodeCount)
                {
                    for (j = -1; j <= 1; j++)
                    {
                        checkY = gridY + j;
                        if (checkY >= 0 && checkY < GridManager.NodeCount)
                        {
                            GridNode checkNode = GridManager.Grid [GridManager.GetGridIndex(checkX, checkY)];

                            if (i == 0 && j == 0)
                            {
                                continue;
                            }

                            if (checkNode.Unwalkable)
                            {
                                Obstructed = true;
                            }

                            //if ((i != 0 && j != 0)) continue;
                            NeighborNodes [GetNeighborIndex(i, j)] = checkNode;
                        }
                    }
                }
            }
        }
コード例 #2
0
 public void Setup(int _x, int _y)
 {
     gridX      = _x;
     gridY      = _y;
     gridIndex  = GridManager.GetGridIndex(gridX, gridY);
     WorldPos.x = gridX * FixedMath.One + GridManager.OffsetX;
     WorldPos.y = gridY * FixedMath.One + GridManager.OffsetY;
 }
コード例 #3
0
 public void Setup(int _x, int _y)
 {
     if (_x < 0 || _y < 0)
     {
         Debug.LogError("Cannot be negative!");
     }
     gridX      = _x;
     gridY      = _y;
     gridIndex  = GridManager.GetGridIndex(gridX, gridY);
     WorldPos.x = gridX * FixedMath.One + GridManager.OffsetX;
     WorldPos.y = gridY * FixedMath.One + GridManager.OffsetY;
 }
コード例 #4
0
        private void GenerateNeighbors()
        {
            //0-3 = sides, 4-7 = diagonals
            //0 = (-1, 0)
            //1 = (0,-1)
            //2 = (0,1)
            //3 = (1,0)
            //4 = (-1,-1)
            //5 = (-1,1)
            //6 = (1,-1)
            //7 = (1,1)
            int sideIndex     = 0;
            int diagonalIndex = 4;             //I learned how to spell [s]diagnal[/s] diagonal!!!

            for (i = -1; i <= 1; i++)
            {
                checkX = gridX + i;

                for (j = -1; j <= 1; j++)
                {
                    if (i == 0 && j == 0)                     //Don't do anything for the same node
                    {
                        continue;
                    }
                    checkY = gridY + j;
                    if (GridManager.ValidateCoordinates(checkX, checkY))
                    {
                        int neighborIndex;
                        if ((i != 0 && j != 0))
                        {
                            //Diagonal
                            if (GridManager.UseDiagonalConnections)
                            {
                                neighborIndex = diagonalIndex++;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        else
                        {
                            neighborIndex = sideIndex++;
                        }
                        GridNode checkNode = GridManager.Grid [GridManager.GetGridIndex(checkX, checkY)];
                        NeighborNodes [neighborIndex] = checkNode;
                    }
                }
            }
        }
コード例 #5
0
        private void GenerateNeighbors()
        {
            for (i = -1; i <= 1; i++)
            {
                checkX = gridX + i;
                if (checkX >= 0 && checkX < GridManager.NodeCount)
                {
                    for (j = -1; j <= 1; j++)
                    {
                        if (i == 0 && j == 0)
                        {
                            continue;
                        }
                        //if (i != 0 && j != 0) continue;

                        checkY = gridY + j;
                        if (checkY >= 0 && checkY < GridManager.NodeCount)
                        {
                            GridNode checkNode = GridManager.Grid [GridManager.GetGridIndex(checkX, checkY)];
                            if (checkNode.Unwalkable)
                            {
                                Obstructed = true;
                            }
                            GetNeighborIndex(i, j);
                            if (i != 0)
                            {
                                if (j != 0)
                                {
                                    NeighborDiagnal[leIndex] = (true);
                                }
                                else
                                {
                                    NeighborDiagnal[leIndex] = (false);
                                }
                            }
                            else
                            {
                                NeighborDiagnal[leIndex] = (false);
                            }
                            NeighborNodes[leIndex] = checkNode;
                            NeighborCount++;
                        }
                    }
                }
            }
        }
コード例 #6
0
        public bool UnpassableLarge()
        {
            int half = (CachedSize + 1) / 2;

            for (int x = -half; x <= half; x++)
            {
                for (int y = -half; y <= half; y++)
                {
                    int index = GridManager.GetGridIndex(gridX + x, gridY + y);
                    if (GridManager.ValidateIndex(index))
                    {
                        if (GridManager.Grid[index].Unwalkable)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
コード例 #7
0
        public static bool NeedsPath(GridNode startNode, GridNode endNode, int unitSize)
        {
            //Tests if there is a direct path. If there is, no need to run AStar.
            x0 = startNode.gridX;
            y0 = startNode.gridY;
            x1 = endNode.gridX;
            y1 = endNode.gridY;
            if (y1 > y0)
            {
                compare1 = y1 - y0;
            }
            else
            {
                compare1 = y0 - y1;
            }
            if (x1 > x0)
            {
                compare2 = x1 - x0;
            }
            else
            {
                compare2 = x0 - x1;
            }
            steep = compare1 > compare2;
            if (steep)
            {
                t  = x0;                // swap x0 and y0
                x0 = y0;
                y0 = t;
                t  = x1;                // swap x1 and y1
                x1 = y1;
                y1 = t;
            }
            if (x0 > x1)
            {
                t  = x0;                // swap x0 and x1
                x0 = x1;
                x1 = t;
                t  = y0;                // swap y0 and y1
                y0 = y1;
                y1 = t;
            }
            dx = x1 - x0;

            dy = (y1 - y0);
            if (dy < 0)
            {
                dy = -dy;
            }

            error = dx / 2;
            ystep = (y0 < y1) ? 1 : -1;
            y     = y0;
            GridNode.PrepareUnpassableCheck(unitSize);

            for (x = x0; x <= x1; x++)
            {
                retX = (steep ? y : x);
                retY = (steep ? x : y);

                currentNode = GridManager.Grid[GridManager.GetGridIndex(retX, retY)];
                if (currentNode != null && currentNode.Unpassable())
                {
                    break;
                }
                else if (x == x1)
                {
                    return(false);
                }

                error = error - dy;
                if (error < 0)
                {
                    y     += ystep;
                    error += dx;
                }
            }
            return(true);
        }