/// <summary> /// 判断斜角是通路 /// </summary> /// <returns></returns> private static bool CheckDiagonalDirCross(IntVector2 Pos, JumpDirections dir) { MapTile t1 = null; MapTile t2 = null; if (dir == JumpDirections.RightTop) { t1 = g_map.GetMapTile(Pos + IntVector2.top); t2 = g_map.GetMapTile(Pos + IntVector2.right); } else if (dir == JumpDirections.RightDown) { t1 = g_map.GetMapTile(Pos + IntVector2.down); t2 = g_map.GetMapTile(Pos + IntVector2.right); } else if (dir == JumpDirections.LeftTop) { t1 = g_map.GetMapTile(Pos + IntVector2.top); t2 = g_map.GetMapTile(Pos + IntVector2.left); } else if (dir == JumpDirections.LeftDown) { t1 = g_map.GetMapTile(Pos + IntVector2.left); t2 = g_map.GetMapTile(Pos + IntVector2.down); } if (t1 != null && t1.blocked == true && t2 != null && t2.blocked == true) { return(false); } else { return(true); } }
/// <summary> /// 判断对角方向是否有强制邻居 /// </summary> /// <returns></returns> private static bool CheckHaveForceNeighborsDiagonalDir(IntVector2 startPos, ushort sectorIndex, JumpDirections dir) { bool ret = false; g_StraightDirNum = 0; g_DiagonalDirNum = 0; JumpDirections AddDir = dir; if (dir == JumpDirections.RightTop) { if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightTop, IntVector2.left) == true) { AddDir = JumpDirections.LeftTop; ret = true; } else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightTop, IntVector2.down) == true) { AddDir = JumpDirections.RightDown; ret = true; } if (ret == true) { g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.RightTop; g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Top; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Right; } } else if (dir == JumpDirections.RightDown) { if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightDown, IntVector2.left) == true) { AddDir = JumpDirections.LeftDown; ret = true; } else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightDown, IntVector2.top) == true) { AddDir = JumpDirections.RightTop; ret = true; } if (ret == true) { g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.RightDown; g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Down; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Right; } } else if (dir == JumpDirections.LeftTop) { if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftTop, IntVector2.right) == true) { AddDir = JumpDirections.RightTop; ret = true; } else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftTop, IntVector2.down) == true) { AddDir = JumpDirections.LeftDown; ret = true; } if (ret == true) { g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.LeftTop; g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Top; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Left; } } else if (dir == JumpDirections.LeftDown) { if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftDown, IntVector2.right) == true) { AddDir = JumpDirections.RightDown; ret = true; } else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftDown, IntVector2.top) == true) { AddDir = JumpDirections.LeftTop; ret = true; } if (ret == true) { g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.LeftDown; g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Down; g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Left; } } return(ret); }
/// <summary> /// 对角方向jump /// </summary> private static void DoDiagonalDirJump(PathNode start, JumpPathNode jStart, IntVector2 startPos, ushort sectorIndex, JumpDirections dir, JumpPathNode parent) { IntVector2 Dir = g_DirArray[(int)dir]; MapTile Cur = g_map.GetMapTile(startPos + Dir); while (Cur != null && Cur.blocked == false && Cur.sectorIndex == sectorIndex) { if (Cur.hasPathNodeConnection) { SetPathResult(jStart, parent, start, g_map.GetWayPointPathNode(0, Cur)); if (g_MaxSearchRoad <= 0) { break; } } // 先判断是否为强制邻居 if (CheckHaveForceNeighborsDiagonalDir(Cur.Pos, sectorIndex, dir) == true) { JumpPathNode j = new JumpPathNode(Cur.Pos, parent, g_StraightDirArray, g_StraightDirNum, g_DiagonalDirArray, g_DiagonalDirNum); g_openSet.Add(j); g_openSet.UpdateItem(j); break; } if (dir == JumpDirections.LeftDown) { DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Left, parent); DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Down, parent); } else if (dir == JumpDirections.LeftTop) { DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Left, parent); DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Top, parent); } else if (dir == JumpDirections.RightDown) { DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Right, parent); DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Down, parent); } else if (dir == JumpDirections.RightTop) { DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Right, parent); DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Top, parent); } // 对角通路问题 if (CheckDiagonalDirCross(Cur.Pos, dir) == false) { break; } Cur = g_map.GetMapTile(Cur.Pos + Dir); } }
/// <summary> /// 直线方向jump /// </summary> private static void DoStraightDirJump(PathNode start, JumpPathNode jStart, IntVector2 startPos, ushort sectorIndex, JumpDirections dir, JumpPathNode parent) { IntVector2 Dir = g_DirArray[(int)dir]; MapTile Cur = g_map.GetMapTile(startPos + Dir); while (Cur != null && Cur.blocked == false && Cur.sectorIndex == sectorIndex) { MapTile next = g_map.GetMapTile(Cur.Pos + Dir); // 判断出界或阻断。 if (next == null || next.blocked == true || next.sectorIndex != sectorIndex) { break; } if (next.hasPathNodeConnection) { SetPathResult(jStart, parent, start, g_map.GetWayPointPathNode(0, next)); g_MaxSearchRoad--; if (g_MaxSearchRoad <= 0) { break; } } // 判断是否有强迫邻居 if (CheckHaveForceNeighborsStraightDir(Cur.Pos, sectorIndex, dir) == true) { JumpPathNode j = new JumpPathNode(Cur.Pos, parent, g_StraightDirArray, g_StraightDirNum, g_DiagonalDirArray, g_DiagonalDirNum); g_openSet.Add(j); g_openSet.UpdateItem(j); break; } else { Cur = next; } } }