예제 #1
0
파일: AStarImpl.cs 프로젝트: uiopsczc/Test
 protected override bool CanPass(int xWithoutOffset, int yWithoutOffset)
 {
     if (!AStarUtil.CanPass(astarMapPath.GetFinalGrids(), xWithoutOffset, yWithoutOffset, canPassObstacleTypes, canPassTerrainTypes))
     {
         return(false);
     }
     return(true);
 }
예제 #2
0
 public static void Test_CanPass2()
 {
     LogCat.log(AStarUtil.CanPass(new AStarMapPath(grids), new List <Vector2Int>
     {
         new Vector2Int(1, 1),
         new Vector2Int(2, 2),
         new Vector2Int(3, 3)
     }, AStarMapPathConst.Critter_Can_Pass_Obstacle_Types, AStarMapPathConst.User_Can_Pass_Terrain_Types));
 }
예제 #3
0
        //直角寻路(先横向再纵向寻路)
        public static List <Vector2Int> BorderFindPath(AStarMapPath astarMapPath, Vector2Int pointA, Vector2Int pointB,
                                                       int[] canPassObstacleTypes, int[] canPassTerrainTypes)
        {
            if (!AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointA) ||
                !AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointB))
            {
                return(null);
            }
            List <Vector2Int> list = new List <Vector2Int> {
                pointA
            };
            int dv = pointB.x > pointA.x ? 1 : -1;

            for (int x = pointA.x + dv; x *dv <= pointB.x *dv; x += dv)
            {
                //      LogCat.log(x, point_a.y);
                if (!AStarUtil.CanPass(astarMapPath, x, pointA.y, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                list.Add(new Vector2Int(x, pointA.y));
            }

            dv = pointB.y > pointA.y ? 1 : -1;
            for (int y = pointA.y + dv; y *dv < pointB.y *dv; y += dv)
            {
                if (!AStarUtil.CanPass(astarMapPath, pointB.x, y, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                list.Add(new Vector2Int(pointB.x, y));
            }

            list.Add(pointB);
            return(list);
        }
예제 #4
0
        //对角线寻路
        public static List <Vector2Int> DiagonallyFindPath(AStarMapPath astarMapPath, Vector2Int pointA,
                                                           Vector2Int pointB,
                                                           int[] canPassObstacleTypes,
                                                           int[] canPassTerrainTypes)
        {
            if (!AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointA) ||
                !AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointB))
            {
                return(null);
            }
            List <Vector2Int> list = new List <Vector2Int>();

            int dx = pointB.x - pointA.x;
            int dy = pointB.y - pointA.y;

            if (Math.Abs(dx) > Math.Abs(dy))
            {
                int x1;
                if (dx > 0)
                {
                    x1 = pointA.x + Math.Abs(dy);
                }
                else
                {
                    x1 = pointA.x - Math.Abs(dy);
                }
                Vector2Int p = new Vector2Int(x1, pointB.y);
                if (!AStarUtil.CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                List <Vector2Int> list1 = AStarUtil.GetLinePointList(pointA, p);
                if (!AStarUtil.CanPass(astarMapPath, list1, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                List <Vector2Int> list2 = AStarUtil.GetLinePointList(p, pointB);
                if (!AStarUtil.CanPass(astarMapPath, list2, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                list.AddRange(list1);
                list.RemoveLast();                 //删掉p
                list.AddRange(list2);
            }
            else
            {
                int y1;
                if (dy > 0)
                {
                    y1 = pointA.y + Math.Abs(dx);
                }
                else
                {
                    y1 = pointA.y - Math.Abs(dx);
                }
                Vector2Int p = new Vector2Int(pointB.x, y1);
                if (!AStarUtil.CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                List <Vector2Int> list1 = AStarUtil.GetLinePointList(pointA, p);
                if (!AStarUtil.CanPass(astarMapPath, list1, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                List <Vector2Int> list2 = AStarUtil.GetLinePointList(p, pointB);
                if (!AStarUtil.CanPass(astarMapPath, list2, canPassObstacleTypes, canPassTerrainTypes))
                {
                    return(null);
                }
                list.AddRange(list1);
                list.RemoveLast();                 //删掉p
                list.AddRange(list2);
            }

            return(list);
        }
예제 #5
0
        //先对角线查找,再直角查找
        public static List <Vector2Int> DirectFindPath(AStarMapPath astarMapPath, Vector2Int pointA, Vector2Int pointB,
                                                       int[] canPassObstacleTypes, int[] canPassTerrainTypes)
        {
            if (!AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointA) ||
                !AStarUtil.IsInRange(astarMapPath.GetFinalGrids(), pointB))
            {
                return(null);
            }
            List <Vector2Int> list = null;

            if (pointA.Equals(pointB))             // 同一点
            {
                list = new List <Vector2Int> {
                    pointA
                };
            }
            else if (pointA.x == pointB.x)
            {
                list = new List <Vector2Int> {
                    pointA
                };
                int dv = pointB.y > pointA.y ? 1 : -1;
                for (int y = pointA.y + dv; y *dv < pointB.y *dv; y += dv)
                {
                    if (!AStarUtil.CanPass(astarMapPath, pointA.x, y, canPassObstacleTypes, canPassTerrainTypes))
                    {
                        return(null);
                    }
                    list.Add(new Vector2Int(pointA.x, y));
                }

                list.Add(pointB);
            }
            else if (pointA.y == pointB.y)
            {
                list = new List <Vector2Int> {
                    pointA
                };
                int dv = pointB.x > pointA.x ? 1 : -1;
                for (int x = pointA.x + dv; x *dv < pointB.x *dv; x += dv)
                {
                    if (!AStarUtil.CanPass(astarMapPath, x, pointA.y, canPassObstacleTypes, canPassTerrainTypes))
                    {
                        return(null);
                    }
                    list.Add(new Vector2Int(x, pointA.y));
                }

                list.Add(pointB);
            }
            else
            {
                //先对角线查找,再直角查找
                list = DiagonallyFindPath(astarMapPath, pointA, pointB, canPassObstacleTypes,
                                          canPassTerrainTypes);
                if (list == null)
                {
                    list = DiagonallyFindPath(astarMapPath, pointB, pointA, canPassObstacleTypes,
                                              canPassTerrainTypes);
                    if (list == null)
                    {
                        list = BorderFindPath(astarMapPath, pointA, pointB, canPassObstacleTypes,
                                              canPassTerrainTypes);
                        if (list == null)
                        {
                            list = BorderFindPath(astarMapPath, pointB, pointA, canPassObstacleTypes,
                                                  canPassTerrainTypes);
                            list?.Reverse();
                        }
                    }
                    else
                    {
                        list.Reverse();
                    }
                }
            }

            return(list);
        }
예제 #6
0
 //检测轨迹是否可通过
 // can_out 是否允许在场景外
 public bool CanPass(List <Vector2Int> trackList, int[] canPassObstacleTypes,
                     int[] canPassTerrainTypes, bool isCanOut = false)
 {
     return(AStarUtil.CanPass(this, trackList, canPassObstacleTypes, canPassTerrainTypes, isCanOut));
 }
예제 #7
0
 //检测某个点是否可通过
 // can_out 是否允许在场景外
 public bool CanPass(int x, int y, int[] canPassObstacleTypes,
                     int[] canPassTerrainTypes, bool isCanOut = false)
 {
     return(AStarUtil.CanPass(this, x, y, canPassObstacleTypes, canPassTerrainTypes, isCanOut));
 }
예제 #8
0
 public static void Test_CanPass1()
 {
     LogCat.log(AStarUtil.CanPass(grids, 2, 2, AStarMapPathConst.Critter_Can_Pass_Obstacle_Types,
                                  AStarMapPathConst.User_Can_Pass_Terrain_Types));
 }