private void PlaceRoom(int sx, int sy, CForestRoomMeta meta) { for (int x = 0; x < meta.Size.x; x++) { for (int y = 0; y < meta.Size.y; y++) { SetTileData(sx + x, sy + y, meta.sId, meta.GetSpot(x, y)); } } var room = new CForestRoomData(meta.sId, sx, sy); m_roomList.Add(room); }
private void TunnelTwoRoom(CForestRoomData a, CForestRoomData b) { bool v = CheckTunnelDoor(a, b); if (!v) { return; } m_starGrid.SetStartNode(a.DoorForTunnel); m_starGrid.SetEndNode(b.DoorForTunnel); m_astar.FindPath(m_starGrid); var path = m_astar.Path; foreach (var node in path) { SetTileData(node.Col, node.Row, "-1", CForestRoomTileType.OuterRoad); } }
/// <summary> /// 根据两个房子的方向, 确认两个房子的连接路时的门 /// </summary> private bool CheckTunnelDoor(CForestRoomData a, CForestRoomData b) { if (a.Meta.DoorPosList.Count == 0) { return(false); } if (b.Meta.DoorPosList.Count == 0) { return(false); } int minDis = int.MaxValue; int aIndex = -1; int bIndex = -1; for (int i = 0; i < a.Meta.DoorPosList.Count; i++) { Vector2Int ad = a.GetDoorPosition(i); for (int j = 0; j < b.Meta.DoorPosList.Count; j++) { Vector2Int bd = b.GetDoorPosition(j); int dis = ad.ManhattanMagnitude(bd); if (dis < minDis) { minDis = dis; aIndex = i; bIndex = j; } } } a.SetTempDoorForTunnel(aIndex); b.SetTempDoorForTunnel(bIndex); return(true); }