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); } } } }
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); } } }
public void CopyUnWalkableFrom(IWalkableGrid grid) { m_mapWalkableData.CopyUnWalkableFrom(grid); }
public void CopyWalkableFrom(IWalkableGrid grid) { CopyWalkableFrom(grid, 0, 0, m_size.x, m_size.y); }
/// <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); }
/// <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)); }