Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / GenerateDungeon.cs
@lijincheng lijincheng on 23 Feb 2023 21 KB 小修改
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 地牢生成器
  8. /// </summary>
  9. public class GenerateDungeon
  10. {
  11. /// <summary>
  12. /// 过道宽度
  13. /// </summary>
  14. public const int CorridorWidth = 4;
  15. /// <summary>
  16. /// 所有生成的房间, 调用过 Generate() 函数才能获取到值
  17. /// </summary>
  18. public List<RoomInfo> RoomInfos { get; } = new List<RoomInfo>();
  19.  
  20. /// <summary>
  21. /// 起始房间
  22. /// </summary>
  23. public RoomInfo StartRoom { get; private set; }
  24. /// <summary>
  25. /// 生成的房间数量
  26. /// </summary>
  27. private int _maxCount = 7;
  28.  
  29. //用于标记地图上的坐标是否被占用
  30. private Grid<bool> _roomGrid { get; } = new Grid<bool>();
  31. //当前房间数量
  32. private int _count = 0;
  33. //宽高
  34. private int _roomMinWidth = 15;
  35. private int _roomMaxWidth = 35;
  36. private int _roomMinHeight = 15;
  37. private int _roomMaxHeight = 30;
  38.  
  39. //间隔
  40. private int _roomMinInterval = 6;
  41. private int _roomMaxInterval = 10;
  42.  
  43. //房间横轴分散程度
  44. private float _roomHorizontalMinDispersion = 0f;
  45. private float _roomHorizontalMaxDispersion = 0f;
  46.  
  47. //房间纵轴分散程度
  48. private float _roomVerticalMinDispersion = 0f;
  49. private float _roomVerticalMaxDispersion = 0f;
  50.  
  51. //区域限制
  52. private bool _enableLimitRange = true;
  53. private int _rangeX = 110;
  54. private int _rangeY = 110;
  55. //找房间失败次数, 过大则会关闭区域限制
  56. private int _maxFailCount = 10;
  57. private int _failCount = 0;
  58.  
  59. private enum GenerateRoomErrorCode
  60. {
  61. NoError,
  62. //房间已满
  63. RoomFull,
  64. //超出区域
  65. OutArea,
  66. //碰到其他房间或过道
  67. HasCollision,
  68. //没有合适的门
  69. NoProperDoor,
  70. }
  71. /// <summary>
  72. /// 生成房间
  73. /// </summary>
  74. public void Generate()
  75. {
  76. if (StartRoom != null) return;
  77.  
  78. //第一个房间
  79. GenerateRoom(null, 0, out var startRoom);
  80. StartRoom = startRoom;
  81. //如果房间数量不够, 就一直生成
  82. while (_count < _maxCount)
  83. {
  84. var room = Utils.RandChoose(RoomInfos);
  85. var errorCode = GenerateRoom(room, Utils.RandRangeInt(0, 3), out var nextRoom);
  86. if (errorCode == GenerateRoomErrorCode.NoError)
  87. {
  88. _failCount = 0;
  89. room.Next.Add(nextRoom);
  90. }
  91. else
  92. {
  93. GD.Print("生成第" + (_count + 1) + "个房间失败! 失败原因: " + errorCode);
  94. if (errorCode == GenerateRoomErrorCode.OutArea)
  95. {
  96. _failCount++;
  97. GD.Print("超出区域失败次数: " + _failCount);
  98. if (_failCount >= _maxFailCount)
  99. {
  100. _enableLimitRange = false;
  101. GD.Print("生成房间失败次数过多, 关闭区域限制!");
  102. }
  103. }
  104. }
  105. }
  106. _roomGrid.Clear();
  107. }
  108.  
  109. //生成房间
  110. private GenerateRoomErrorCode GenerateRoom(RoomInfo prevRoomInfo, int direction, out RoomInfo resultRoom)
  111. {
  112. if (_count >= _maxCount)
  113. {
  114. resultRoom = null;
  115. return GenerateRoomErrorCode.RoomFull;
  116. }
  117.  
  118. //随机选择一个房间
  119. var roomSplit = Utils.RandChoose(GameApplication.Instance.RoomConfig);
  120. var room = new RoomInfo(_count, roomSplit);
  121. //房间大小
  122. room.Size = new Vector2I((int)roomSplit.RoomInfo.Size.X, (int)roomSplit.RoomInfo.Size.Y);
  123.  
  124. //随机生成房间 (老流程)
  125. // room.Size = new Vector2(Utils.RandRangeInt(_roomMinWidth, _roomMaxWidth),
  126. // Utils.RandRangeInt(_roomMinHeight, _roomMaxHeight));
  127.  
  128. if (prevRoomInfo != null) //表示这不是第一个房间, 就得判断当前位置下的房间是否被遮挡
  129. {
  130. //房间间隔
  131. var space = Utils.RandRangeInt(_roomMinInterval, _roomMaxInterval);
  132. //中心偏移
  133. int offset;
  134. if (direction == 0 || direction == 2)
  135. {
  136. offset = Utils.RandRangeInt(-(int)(prevRoomInfo.Size.X * _roomVerticalMinDispersion),
  137. (int)(prevRoomInfo.Size.X * _roomVerticalMaxDispersion));
  138. }
  139. else
  140. {
  141. offset = Utils.RandRangeInt(-(int)(prevRoomInfo.Size.Y * _roomHorizontalMinDispersion),
  142. (int)(prevRoomInfo.Size.Y * _roomHorizontalMaxDispersion));
  143. }
  144.  
  145. //计算房间位置
  146. if (direction == 0) //上
  147. {
  148. room.Position = new Vector2I(prevRoomInfo.Position.X + offset,
  149. prevRoomInfo.Position.Y - room.Size.Y - space);
  150. }
  151. else if (direction == 1) //右
  152. {
  153. room.Position = new Vector2I(prevRoomInfo.Position.X + prevRoomInfo.Size.Y + space,
  154. prevRoomInfo.Position.Y + offset);
  155. }
  156. else if (direction == 2) //下
  157. {
  158. room.Position = new Vector2I(prevRoomInfo.Position.X + offset,
  159. prevRoomInfo.Position.Y + prevRoomInfo.Size.Y + space);
  160. }
  161. else if (direction == 3) //左
  162. {
  163. room.Position = new Vector2I(prevRoomInfo.Position.X - room.Size.X - space,
  164. prevRoomInfo.Position.Y + offset);
  165. }
  166. //是否在限制区域内
  167. if (_enableLimitRange)
  168. {
  169. if (room.Position.X < -_rangeX || room.Position.X + room.Size.X > _rangeX || room.Position.Y < -_rangeY || room.Position.Y + room.Size.Y > _rangeY)
  170. {
  171. resultRoom = null;
  172. return GenerateRoomErrorCode.OutArea;
  173. }
  174. }
  175.  
  176. //是否碰到其他房间或者过道
  177. if (_roomGrid.RectCollision(room.Position - new Vector2(3, 3), room.Size + new Vector2(6, 6)))
  178. {
  179. resultRoom = null;
  180. return GenerateRoomErrorCode.HasCollision;
  181. }
  182.  
  183. _roomGrid.AddRect(room.Position, room.Size, true);
  184.  
  185. //找门, 与上一个房间是否能连通
  186. if (!ConnectDoor(prevRoomInfo, room))
  187. {
  188. _roomGrid.RemoveRect(room.Position, room.Size);
  189. resultRoom = null;
  190. return GenerateRoomErrorCode.NoProperDoor;
  191. }
  192. }
  193.  
  194. _count++;
  195. RoomInfos.Add(room);
  196. if (prevRoomInfo == null)
  197. {
  198. _roomGrid.AddRect(room.Position, room.Size, true);
  199. }
  200.  
  201. //下一个房间
  202. //0上, 1右, 2下, 3左
  203. var dirList = new List<int>(new[] { 0, 1, 2, 3 });
  204. if (prevRoomInfo != null)
  205. {
  206. dirList.Remove(GetReverseDirection(direction));
  207. }
  208.  
  209. //这条线有一定概率不生成下一个房间
  210. if (Utils.RandRangeInt(0, 2) != 0)
  211. {
  212. while (dirList.Count > 0)
  213. {
  214. var randDir = Utils.RandChoose(dirList);
  215. GenerateRoom(room, randDir, out var nextRoom);
  216. if (nextRoom == null)
  217. {
  218. break;
  219. }
  220.  
  221. nextRoom.Prev = room;
  222. room.Next.Add(nextRoom);
  223.  
  224. dirList.Remove(randDir);
  225. }
  226. }
  227.  
  228. resultRoom = room;
  229. return GenerateRoomErrorCode.NoError;
  230. }
  231.  
  232. /// <summary>
  233. /// 找两个房间的门
  234. /// </summary>
  235. private bool ConnectDoor(RoomInfo room, RoomInfo nextRoom)
  236. {
  237. //门描述
  238. var roomDoor = new RoomDoorInfo();
  239. var nextRoomDoor = new RoomDoorInfo();
  240. roomDoor.RoomInfo = room;
  241. nextRoomDoor.RoomInfo = nextRoom;
  242. roomDoor.ConnectRoom = nextRoom;
  243. roomDoor.ConnectDoor = nextRoomDoor;
  244. nextRoomDoor.ConnectRoom = room;
  245. nextRoomDoor.ConnectDoor = roomDoor;
  246.  
  247. var overlapX = Mathf.Min(room.Position.X + room.Size.X, nextRoom.Position.X + nextRoom.Size.X) -
  248. Mathf.Max(room.Position.X, nextRoom.Position.X);
  249. //这种情况下x轴有重叠
  250. if (overlapX >= 6)
  251. {
  252. //找到重叠区域
  253. var range = CalcOverlapRange(room.Position.X, room.Position.X + room.Size.X,
  254. nextRoom.Position.X, nextRoom.Position.X + nextRoom.Size.X);
  255. var x = Utils.RandRangeInt((int)range.X + 1, (int)range.Y - CorridorWidth - 1);
  256.  
  257. if (room.Position.Y < nextRoom.Position.Y) //room在上, nextRoom在下
  258. {
  259. roomDoor.Direction = DoorDirection.S;
  260. nextRoomDoor.Direction = DoorDirection.N;
  261. roomDoor.OriginPosition = new Vector2(x, room.Position.Y + room.Size.Y);
  262. nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y);
  263. }
  264. else //room在下, nextRoom在上
  265. {
  266. roomDoor.Direction = DoorDirection.N;
  267. nextRoomDoor.Direction = DoorDirection.S;
  268. roomDoor.OriginPosition = new Vector2(x, room.Position.Y);
  269. nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y + nextRoom.Size.Y);
  270. }
  271.  
  272. //判断门之间的通道是否有物体碰到
  273. if (!AddCorridorToGridRange(roomDoor, nextRoomDoor))
  274. {
  275. //此门不能连通
  276. return false;
  277. }
  278.  
  279. //没有撞到物体
  280. room.Doors.Add(roomDoor);
  281. nextRoom.Doors.Add(nextRoomDoor);
  282. return true;
  283. }
  284.  
  285. var overlapY = Mathf.Min(room.Position.Y + room.Size.Y, nextRoom.Position.Y + nextRoom.Size.Y) -
  286. Mathf.Max(room.Position.Y, nextRoom.Position.Y);
  287. //这种情况下y轴有重叠
  288. if (overlapY >= 6)
  289. {
  290. //找到重叠区域
  291. var range = CalcOverlapRange(room.Position.Y, room.Position.Y + room.Size.Y,
  292. nextRoom.Position.Y, nextRoom.Position.Y + nextRoom.Size.Y);
  293. var y = Utils.RandRangeInt((int)range.X + 1, (int)range.Y - CorridorWidth - 1);
  294.  
  295. if (room.Position.X < nextRoom.Position.X) //room在左, nextRoom在右
  296. {
  297. roomDoor.Direction = DoorDirection.E;
  298. nextRoomDoor.Direction = DoorDirection.W;
  299. roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X, y);
  300. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X, y);
  301. }
  302. else //room在右, nextRoom在左
  303. {
  304. roomDoor.Direction = DoorDirection.W;
  305. nextRoomDoor.Direction = DoorDirection.E;
  306. roomDoor.OriginPosition = new Vector2(room.Position.X, y);
  307. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X, y);
  308. }
  309.  
  310. //判断门之间的通道是否有物体碰到
  311. if (!AddCorridorToGridRange(roomDoor, nextRoomDoor))
  312. {
  313. //此门不能连通
  314. return false;
  315. }
  316.  
  317. //没有撞到物体
  318. room.Doors.Add(roomDoor);
  319. nextRoom.Doors.Add(nextRoomDoor);
  320. return true;
  321. }
  322.  
  323. var offset1 = Mathf.Clamp((int)overlapX + 2, 2, 6);
  324. var offset2 = Mathf.Clamp((int)overlapY + 2, 2, 6);
  325.  
  326. //焦点
  327. Vector2 cross;
  328.  
  329. //这种情况下x和y轴都没有重叠, 那么就只能生成拐角通道了
  330. if (room.Position.X > nextRoom.Position.X)
  331. {
  332. if (room.Position.Y > nextRoom.Position.Y)
  333. {
  334. if (Utils.RandBoolean())
  335. {
  336. roomDoor.Direction = DoorDirection.N; //↑
  337. nextRoomDoor.Direction = DoorDirection.E; //→
  338.  
  339. roomDoor.OriginPosition = new Vector2(room.Position.X + offset1, room.Position.Y);
  340. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X,
  341. nextRoom.Position.Y + nextRoom.Size.Y - offset2 - 6);
  342. cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y);
  343. }
  344. else
  345. {
  346. roomDoor.Direction = DoorDirection.W; //←
  347. nextRoomDoor.Direction = DoorDirection.S; //↓
  348. roomDoor.OriginPosition = new Vector2(room.Position.X, room.Position.Y + offset2);
  349. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X - offset1 - 6,
  350. nextRoom.Position.Y + nextRoom.Size.Y);
  351. cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y);
  352. }
  353. }
  354. else
  355. {
  356. if (Utils.RandBoolean())
  357. {
  358. roomDoor.Direction = DoorDirection.S; //↓
  359. nextRoomDoor.Direction = DoorDirection.E; //→
  360.  
  361. roomDoor.OriginPosition = new Vector2(room.Position.X + offset1, room.Position.Y + room.Size.Y);
  362. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X,
  363. nextRoom.Position.Y + offset2);
  364. cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y);
  365. }
  366. else
  367. {
  368. roomDoor.Direction = DoorDirection.W; //←
  369. nextRoomDoor.Direction = DoorDirection.N; //↑
  370.  
  371. roomDoor.OriginPosition =
  372. new Vector2(room.Position.X, room.Position.Y + room.Size.Y - offset2 - 6); //
  373. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X - offset2 - 6,
  374. nextRoom.Position.Y);
  375. cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y);
  376. }
  377. }
  378. }
  379. else
  380. {
  381. if (room.Position.Y > nextRoom.Position.Y)
  382. {
  383. if (Utils.RandBoolean())
  384. {
  385. roomDoor.Direction = DoorDirection.E; //→
  386. nextRoomDoor.Direction = DoorDirection.S; //↓
  387.  
  388. roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X, room.Position.Y + offset2);
  389. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + offset1,
  390. nextRoom.Position.Y + nextRoom.Size.Y);
  391. cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y);
  392. }
  393. else
  394. {
  395. roomDoor.Direction = DoorDirection.N; //↑
  396. nextRoomDoor.Direction = DoorDirection.W; //←
  397.  
  398. roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X - offset1 - 6, room.Position.Y);
  399. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X,
  400. nextRoom.Position.Y + nextRoom.Size.Y - offset2 - 6);
  401. cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y);
  402. }
  403. }
  404. else
  405. {
  406. if (Utils.RandBoolean())
  407. {
  408. roomDoor.Direction = DoorDirection.E; //→
  409. nextRoomDoor.Direction = DoorDirection.N; //↑
  410.  
  411. roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X,
  412. room.Position.Y + room.Size.Y - offset2 - 6);
  413. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + offset1, nextRoom.Position.Y);
  414. cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y);
  415. }
  416. else
  417. {
  418. roomDoor.Direction = DoorDirection.S; //↓
  419. nextRoomDoor.Direction = DoorDirection.W; //←
  420.  
  421. roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X - offset1 - 6,
  422. room.Position.Y + room.Size.Y);
  423. nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X, nextRoom.Position.Y + offset2);
  424. cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y);
  425. }
  426. }
  427. }
  428.  
  429. //判断门之间的通道是否有物体碰到
  430. if (!AddCorridorToGridRange(roomDoor, nextRoomDoor, cross))
  431. {
  432. //此门不能连通
  433. return false;
  434. }
  435.  
  436. roomDoor.HasCross = true;
  437. roomDoor.Cross = cross;
  438. nextRoomDoor.HasCross = true;
  439. nextRoomDoor.Cross = cross;
  440.  
  441. room.Doors.Add(roomDoor);
  442. nextRoom.Doors.Add(nextRoomDoor);
  443. return true;
  444. }
  445.  
  446. /// <summary>
  447. /// 查找房间的连接通道, 函数返回是否找到对应的门, 通过 result 返回 x/y 轴坐标
  448. /// </summary>
  449. /// <param name="room">第一个房间</param>
  450. /// <param name="nextRoom">第二个房间</param>
  451. /// <param name="direction">第一个房间连接方向</param>
  452. /// <param name="result">返回连接的 x/y 轴坐标</param>
  453. private bool FindPassage(RoomInfo room, RoomInfo nextRoom, DoorDirection direction, out int result)
  454. {
  455. var room1 = room.RoomSplit.RoomInfo;
  456. var room2 = nextRoom.RoomSplit.RoomInfo;
  457. foreach (var doorAreaInfo1 in room1.DoorAreaInfos)
  458. {
  459. if (doorAreaInfo1.Direction == direction)
  460. {
  461.  
  462. switch (direction)
  463. {
  464. case DoorDirection.E:
  465. break;
  466. case DoorDirection.W:
  467. break;
  468. case DoorDirection.S: //第二个门向↑
  469. break;
  470. case DoorDirection.N: //第二个门向↓
  471. break;
  472. }
  473. }
  474. }
  475.  
  476. result = 0;
  477. return false;
  478. }
  479. //用于计算重叠区域坐标, 可以理解为一维轴上4个点的中间两个点
  480. private Vector2 CalcOverlapRange(float start1, float end1, float start2, float end2)
  481. {
  482. return new Vector2(Mathf.Max(start1, start2), Mathf.Min(end1, end2));
  483. }
  484.  
  485. //返回参数方向的反方向
  486. private int GetReverseDirection(int direction)
  487. {
  488. switch (direction)
  489. {
  490. case 0: return 2;
  491. case 1: return 3;
  492. case 2: return 0;
  493. case 3: return 1;
  494. }
  495.  
  496. return 2;
  497. }
  498.  
  499. //将两个门间的过道占用数据存入RoomGrid
  500. private bool AddCorridorToGridRange(RoomDoorInfo door1, RoomDoorInfo door2)
  501. {
  502. var point1 = door1.OriginPosition;
  503. var point2 = door2.OriginPosition;
  504. var pos = new Vector2(Mathf.Min(point1.X, point2.X), Mathf.Min(point1.Y, point2.Y));
  505. var size = new Vector2(
  506. point1.X == point2.X ? CorridorWidth : Mathf.Abs(point1.X - point2.X),
  507. point1.Y == point2.Y ? CorridorWidth : Mathf.Abs(point1.Y - point2.Y)
  508. );
  509.  
  510. Vector2 collPos;
  511. Vector2 collSize;
  512. if (point1.X == point2.X) //纵向加宽, 防止贴到其它墙
  513. {
  514. collPos = new Vector2(pos.X - 3, pos.Y);
  515. collSize = new Vector2(size.X + 6, size.Y);
  516. }
  517. else //横向加宽, 防止贴到其它墙
  518. {
  519. collPos = new Vector2(pos.X, pos.Y - 3);
  520. collSize = new Vector2(size.X, size.Y + 6);
  521. }
  522.  
  523. if (_roomGrid.RectCollision(collPos, collSize))
  524. {
  525. return false;
  526. }
  527.  
  528. _roomGrid.AddRect(pos, size, true);
  529. return true;
  530. }
  531.  
  532. //将两个门间的过道占用数据存入RoomGrid, 该重载
  533. private bool AddCorridorToGridRange(RoomDoorInfo door1, RoomDoorInfo door2, Vector2 cross)
  534. {
  535. var point1 = door1.OriginPosition;
  536. var point2 = door2.OriginPosition;
  537. var pos1 = new Vector2(Mathf.Min(point1.X, cross.X), Mathf.Min(point1.Y, cross.Y));
  538. var size1 = new Vector2(
  539. point1.X == cross.X ? CorridorWidth : Mathf.Abs(point1.X - cross.X),
  540. point1.Y == cross.Y ? CorridorWidth : Mathf.Abs(point1.Y - cross.Y)
  541. );
  542. var pos2 = new Vector2(Mathf.Min(point2.X, cross.X), Mathf.Min(point2.Y, cross.Y));
  543. var size2 = new Vector2(
  544. point2.X == cross.X ? CorridorWidth : Mathf.Abs(point2.X - cross.X),
  545. point2.Y == cross.Y ? CorridorWidth : Mathf.Abs(point2.Y - cross.Y)
  546. );
  547.  
  548. Vector2 collPos1;
  549. Vector2 collSize1;
  550. if (point1.X == cross.X) //纵向加宽, 防止贴到其它墙
  551. {
  552. collPos1 = new Vector2(pos1.X - 3, pos1.Y);
  553. collSize1 = new Vector2(size1.X + 6, size1.Y);
  554. }
  555. else //横向加宽, 防止贴到其它墙
  556. {
  557. collPos1 = new Vector2(pos1.X, pos1.Y - 3);
  558. collSize1 = new Vector2(size1.X, size1.Y + 6);
  559. }
  560.  
  561. if (_roomGrid.RectCollision(collPos1, collSize1))
  562. {
  563. return false;
  564. }
  565.  
  566. Vector2 collPos2;
  567. Vector2 collSize2;
  568. if (point2.X == cross.X) //纵向加宽, 防止贴到其它墙
  569. {
  570. collPos2 = new Vector2(pos2.X - 3, pos2.Y);
  571. collSize2 = new Vector2(size2.X + 6, size2.Y);
  572. }
  573. else //横向加宽, 防止贴到其它墙
  574. {
  575. collPos2 = new Vector2(pos2.X, pos2.Y - 3);
  576. collSize2 = new Vector2(size2.X, size2.Y + 6);
  577. }
  578.  
  579. if (_roomGrid.RectCollision(collPos2, collSize2))
  580. {
  581. return false;
  582. }
  583.  
  584. _roomGrid.AddRect(pos1, size1, true);
  585. _roomGrid.AddRect(pos2, size2, true);
  586. return true;
  587. }
  588. }