Exemple #1
0
        protected bool IsSkiped(DirectionInfo directionInfo, int x, int y)
        {
            int x1 = 0, y1 = 0, x2 = 0, y2 = 0;

            // 如果当前位置为左上角,则判断其下方和右侧是否为不可穿过的障碍
            if (directionInfo.Equals(DirectionInfoConst.LeftTopDirectionInfo))
            {
                x1 = x;
                y1 = y - 1;
                x2 = x + 1;
                y2 = y;
            }

            // 如果当前位置为右上角,则判断其下方和左侧是否为不可穿过的障碍
            if (directionInfo.Equals(DirectionInfoConst.RightTopDirectionInfo))
            {
                x1 = x;
                y1 = y - 1;
                x2 = x - 1;
                y2 = y;
            }

            // 如果当前位置为左下角,则判断其上方和右侧是否为不可穿过的障碍
            if (directionInfo.Equals(DirectionInfoConst.LeftBottomDirectionInfo))
            {
                x1 = x;
                y1 = y + 1;
                x2 = x + 1;
                y2 = y;
            }

            // 如果当前位置为右下角,则判断其上方和左侧是否为不可穿过的障碍
            if (directionInfo.Equals(DirectionInfoConst.RightBottomDirectionInfo))
            {
                x1 = x;
                y1 = y + 1;
                x2 = x - 1;
                y2 = y;
            }

            // 根据计算后获得的坐标(x1,y1),(x2,y2),判断其是否为不可穿越的障碍,如果是,则跳过该邻居节点
            if (!CanPass(x1, y1) || !CanPass(x2, y2))
            {
                return(true);
            }
            return(false);
        }
Exemple #2
0
        //获得轨迹中可通过的最远点
        public static Vector2Int GetMostPassPoint(AStarMapPath astarMapPath, List <Vector2Int> trackList,
                                                  int[] canPassObstacleTypes,
                                                  int[] canPassTerrainTypes, bool canOut = false)
        {
            Vector2Int lp = trackList[0];
            Vector2Int tp = lp;

            for (int i = 1; i < trackList.Count; i++)
            {
                Vector2Int p = trackList[i];
                if (!CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                {
                    break;
                }

                DirectionInfo directionInfo = DirectionInfoUtil.GetDirectionInfo(p.x - lp.x, p.y - lp.y);
                //      directionInfo = DirectionConst.GetDirectionInfo(0, 0); // 不再判断临边障碍 2012-10-29
                //      LogCat.log(directionInfo.name);
                if (directionInfo == DirectionInfoConst.LeftTopDirectionInfo)                 // 左上角
                {
                    if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                    if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                }
                else if (directionInfo == DirectionInfoConst.RightTopDirectionInfo)                 // 右上角
                {
                    if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                    if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                }
                else if (directionInfo == DirectionInfoConst.RightBottomDirectionInfo)                 // 右下角
                {
                    if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                    if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                }
                else if (directionInfo == DirectionInfoConst.LeftBottomDirectionInfo)                 // 左下角
                {
                    if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                    if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        break;
                    }
                }

                lp = p;
                tp = lp;
            }

            return(tp);
        }
Exemple #3
0
        //检测轨迹是否可通过
        // can_out 是否允许在场景外
        public static bool CanPass(AStarMapPath astarMapPath, List <Vector2Int> trackList, int[] canPassObstacleTypes,
                                   int[] canPassTerrainTypes, bool canOut = false)
        {
            if (trackList.Count == 0)
            {
                return(true);
            }
            Vector2Int lp = trackList[0];

            if (trackList.Count == 1)
            {
                return(CanPass(astarMapPath, lp.x, lp.y, canPassObstacleTypes, canPassTerrainTypes, canOut));
            }
            for (int i = 1; i < trackList.Count; i++)
            {
                Vector2Int p = trackList[i];
                if (!CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                {
                    return(false);
                }

                DirectionInfo directionInfo = DirectionInfoUtil.GetDirectionInfo(p.x - lp.x, p.y - lp.y);
                //      directionInfo = DirectionConst.GetDirectionInfo(0, 0);
                if (directionInfo == DirectionInfoConst.LeftTopDirectionInfo)                 // 左上角
                {
                    if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                    if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                }
                else if (directionInfo == DirectionInfoConst.RightTopDirectionInfo)                 // 右上角
                {
                    if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                    if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                }
                else if (directionInfo == DirectionInfoConst.RightBottomDirectionInfo)                 // 右下角
                {
                    if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                    if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                }
                else if (directionInfo == DirectionInfoConst.LeftBottomDirectionInfo)                 // 左下角
                {
                    if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                    if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut))
                    {
                        return(false);
                    }
                }

                lp = p;
            }

            return(true);
        }