Exemplo n.º 1
0
 public void CopyWalkableFrom(IWalkableGrid grid, int startCol, int startRow, int endCol, int endRow)
 {
     for (int r = startRow; r < endRow; r++)
     {
         for (int c = startCol; c < endCol; c++)
         {
             bool inWalkable = grid.IsWalkable(c, r);
             if (inWalkable)
             {
                 SetWalkable(c, r, true);
             }
         }
     }
 }
Exemplo n.º 2
0
 public void CopyUnWalkableFrom(IWalkableGrid grid, int startCol, int startRow, int endCol, int endRow)
 {
     for (int r = startRow; r < endRow; r++)
     {
         for (int c = startCol; c < endCol; c++)
         {
             if (grid.IsWalkable(c, r))
             {
                 continue;
             }
             SetWalkable(c, r, false);
         }
     }
 }
Exemplo n.º 3
0
 public void CopyUnWalkableFrom(IWalkableGrid grid)
 {
     m_mapWalkableData.CopyUnWalkableFrom(grid);
 }
Exemplo n.º 4
0
 public void CopyWalkableFrom(IWalkableGrid grid)
 {
     CopyWalkableFrom(grid, 0, 0, m_size.x, m_size.y);
 }
Exemplo n.º 5
0
        /// <summary>
        /// 真正进行寻路的函数
        /// 注意我们会加粗直线进行两次探测, 防止一些极端情况的可通过情况的错误
        /// </summary>
        /// <param name="grid"></param>
        /// <returns></returns>
        private bool Find(IWalkableGrid grid)
        {
            //竖线探测
            if (isVertical)
            {
                int start = StartPoint.z;
                int end   = EndPoint.z;
                int col   = m_value;
                for (int row = start; row <= end; row++)
                {
                    bool b = grid.IsWalkable(col, row);
                    if (!b)
                    {
                        return(false);
                    }
                }
                return(true);
            }

            //横线探测
            if (IsHorizonal)
            {
                int start = StartPoint.x;
                int end   = EndPoint.x;
                int row   = m_value;
                for (int col = start; col <= end; col++)
                {
                    bool b = grid.IsWalkable(col, row);
                    if (!b)
                    {
                        return(false);
                    }
                }
                return(true);
            }

            //注意斜线算法会有可能遗漏一些chunk, 所以我们指定规则. chunk必须在正方向上相连
            //这也符合数据定义
            //遍历y轴
            if (kBigger)
            {
                float start = (float)StartPoint.z;
                float end   = (float)EndPoint.z;
                for (float row = start; row <= end; row += 0.5f)
                {
                    float col = GetX(row);
                    bool  b   = grid.IsWalkable((int)row, (int)(col - ExpandValue));
                    if (!b)
                    {
                        return(false);
                    }

                    //对y轴进行偏移再检测. 防止一些极端情况的可通过
                    b = grid.IsWalkable((int)row, (int)(col + ExpandValue));
                    if (!b)
                    {
                        return(false);
                    }
                }


                return(true);
            }

            //遍历x轴
            if (kSmaller)
            {
                float start = (float)StartPoint.x;
                float end   = (float)EndPoint.x;
                for (float col = start; col <= end; col += 0.5f)
                {
                    float row = GetZ(col);
                    bool  b   = grid.IsWalkable((int)(row - ExpandValue), (int)col);
                    if (!b)
                    {
                        return(false);
                    }

                    //对y轴进行偏移再检测. 防止一些极端情况的可通过
                    b = grid.IsWalkable((int)(row + ExpandValue), (int)col);
                    if (!b)
                    {
                        return(false);
                    }
                }
                return(true);
            }

            return(false);
        }
Exemplo n.º 6
0
 /// <summary>
 /// 数据来源超大地图的直线寻路结果
 /// </summary>
 /// <param name="grid"></param>
 /// <param name="startRow"></param>
 /// <param name="startCol"></param>
 /// <param name="endRow"></param>
 /// <param name="endCol"></param>
 /// <returns></returns>
 public bool FindPath(IWalkableGrid grid, int startCol, int startRow, int endCol, int endRow)
 {
     SetData(startCol, startRow, endCol, endRow);
     return(Find(grid));
 }