Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / room / RoomManager.cs
@小李xl 小李xl on 16 Feb 2023 27 KB 地牢生成读取预设房间
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 房间管理器
  8. /// </summary>
  9. public partial class RoomManager : Node2D
  10. {
  11. public const int FloorMapLayer = 0;
  12. public const int MiddleMapLayer = 1;
  13. public const int TopMapLayer = 2;
  14. /// <summary>
  15. /// //对象根节点
  16. /// </summary>
  17. [Export] public Node2D NormalLayer;
  18. /// <summary>
  19. /// 对象根节点, 带y轴排序功能
  20. /// </summary>
  21. [Export] public Node2D YSortLayer;
  22. /// <summary>
  23. /// 地图根节点
  24. /// </summary>
  25. [Export] public TileMap TileRoot;
  26.  
  27. /// <summary>
  28. /// 玩家对象
  29. /// </summary>
  30. public Player Player { get; private set; }
  31.  
  32. /// <summary>
  33. /// 导航区域形状
  34. /// </summary>
  35. public NavigationRegion2D NavigationPolygon { get; private set; }
  36.  
  37. //已经标记过的点
  38. private HashSet<Vector2> _usePoints = new HashSet<Vector2>();
  39.  
  40. //导航区域数据
  41. private List<NavigationPolygonData> _polygonDataList = new List<NavigationPolygonData>();
  42.  
  43. private AutoTileConfig _autoTileConfig;
  44. private Font _font;
  45. private GenerateDungeon _generateDungeon;
  46.  
  47. public override void _EnterTree()
  48. {
  49. //Engine.TimeScale = 0.2f;
  50.  
  51. NavigationPolygon = new NavigationRegion2D();
  52. AddChild(NavigationPolygon);
  53.  
  54. //_tileMap = GetNode<Godot.TileMap>(TileMap);
  55. // var node = child.GetNode("Config");
  56. // Color color = (Color)node.GetMeta("ClearColor");
  57. // GetTabAlignment.SetDefaultClearColor(color);
  58.  
  59. //创建玩家
  60. Player = new Player();
  61. Player.Position = new Vector2(30, 30);
  62. Player.Name = "Player";
  63. Player.PutDown(RoomLayerEnum.YSortLayer);
  64. }
  65.  
  66. public override void _Ready()
  67. {
  68. TileRoot.YSortEnabled = false;
  69. //FloorTileMap.NavigationVisibilityMode = TileMap.VisibilityMode.ForceShow;
  70. _font = ResourceManager.Load<Font>(ResourcePath.resource_font_cn_font_36_tres);
  71.  
  72. //生成地牢房间
  73. _generateDungeon = new GenerateDungeon();
  74. _generateDungeon.Generate();
  75. //填充地牢
  76. _autoTileConfig = new AutoTileConfig();
  77. DungeonTileManager.AutoFillRoomTile(TileRoot, FloorMapLayer, MiddleMapLayer, TopMapLayer, _autoTileConfig, _generateDungeon.StartRoom);
  78.  
  79. //根据房间数据创建填充 tiled
  80. var nowTicks = DateTime.Now.Ticks;
  81. //生成寻路网格
  82. //GenerateNavigationPolygon();
  83. var polygon = new NavigationPolygon();
  84. foreach (var polygonData in _polygonDataList)
  85. {
  86. polygon.AddOutline(polygonData.Points.ToArray());
  87. }
  88. polygon.MakePolygonsFromOutlines();
  89. NavigationPolygon.NavigationPolygon = polygon;
  90. GD.Print("计算NavigationPolygon用时: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒");
  91.  
  92. //播放bgm
  93. SoundManager.PlayMusic(ResourcePath.resource_sound_bgm_Intro_ogg, -17f);
  94.  
  95. Player.PickUpWeapon(WeaponManager.GetGun("1001"));
  96. // Player.PickUpWeapon(WeaponManager.GetGun("1002"));
  97. Player.PickUpWeapon(WeaponManager.GetGun("1004"));
  98. Player.PickUpWeapon(WeaponManager.GetGun("1003"));
  99. // var enemy1 = new Enemy();
  100. // enemy1.PutDown(new Vector2(100, 100), RoomLayerEnum.YSortLayer);
  101. // enemy1.PickUpWeapon(WeaponManager.GetGun("1001"));
  102. // for (int i = 0; i < 10; i++)
  103. // {
  104. // var enemyTemp = new Enemy();
  105. // enemyTemp.PutDown(new Vector2(30 + (i + 1) * 20, 30), RoomLayerEnum.YSortLayer);
  106. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1003"));
  107. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1001"));
  108. // }
  109.  
  110. // var enemy2 = new Enemy();
  111. // enemy2.Name = "Enemy2";
  112. // enemy2.PutDown(new Vector2(120, 100));
  113. // enemy2.PickUpWeapon(WeaponManager.GetGun("1002"));
  114. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1004"));
  115. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1003"));
  116. //
  117. // var enemy3 = new Enemy();
  118. // enemy3.Name = "Enemy3";
  119. // enemy3.PutDown(new Vector2(100, 120));
  120. // enemy3.PickUpWeapon(WeaponManager.GetGun("1003"));
  121. // enemy3.PickUpWeapon(WeaponManager.GetGun("1002"));
  122.  
  123. // WeaponManager.GetGun("1004").PutDown(new Vector2(80, 100), RoomLayerEnum.NormalLayer);
  124. // WeaponManager.GetGun("1001").PutDown(new Vector2(220, 120), RoomLayerEnum.NormalLayer);
  125. // WeaponManager.GetGun("1001").PutDown(new Vector2(230, 120), RoomLayerEnum.NormalLayer);
  126. // WeaponManager.GetGun("1001").PutDown(new Vector2(80, 80), RoomLayerEnum.NormalLayer);
  127. // WeaponManager.GetGun("1002").PutDown(new Vector2(80, 120), RoomLayerEnum.NormalLayer);
  128. // WeaponManager.GetGun("1003").PutDown(new Vector2(120, 80), RoomLayerEnum.NormalLayer);
  129. // WeaponManager.GetGun("1003").PutDown(new Vector2(130, 80), RoomLayerEnum.NormalLayer);
  130. // WeaponManager.GetGun("1003").PutDown(new Vector2(140, 80), RoomLayerEnum.NormalLayer);
  131. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 80), RoomLayerEnum.NormalLayer);
  132. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 180), RoomLayerEnum.NormalLayer);
  133. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 120), RoomLayerEnum.NormalLayer);
  134. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 130), RoomLayerEnum.NormalLayer);
  135.  
  136. }
  137.  
  138. /// <summary>
  139. /// 获取指定层级根节点
  140. /// </summary>
  141. /// <param name="layerEnum"></param>
  142. /// <returns></returns>
  143. public Node2D GetRoomLayer(RoomLayerEnum layerEnum)
  144. {
  145. switch (layerEnum)
  146. {
  147. case RoomLayerEnum.NormalLayer:
  148. return NormalLayer;
  149. case RoomLayerEnum.YSortLayer:
  150. return YSortLayer;
  151. }
  152.  
  153. return null;
  154. }
  155.  
  156. public override void _Process(double delta)
  157. {
  158. Enemy.UpdateEnemiesView();
  159. if (GameApplication.Instance.Debug)
  160. {
  161. QueueRedraw();
  162. }
  163. }
  164.  
  165. public override void _Draw()
  166. {
  167. if (GameApplication.Instance.Debug)
  168. {
  169. //绘制ai寻路区域
  170. for (var i = 0; i < _polygonDataList.Count; i++)
  171. {
  172. var item = _polygonDataList[i];
  173. if (item.Points.Count >= 2)
  174. {
  175. DrawPolyline(item.Points.Concat(new []{ item.Points[0] }).ToArray(), Colors.Red);
  176. }
  177. }
  178. }
  179. //绘制房间区域
  180. DrawRoomInfo(_generateDungeon.StartRoom);
  181. }
  182.  
  183. /// <summary>
  184. /// 返回指定位置的Tile是否为可以行走
  185. /// </summary>
  186. public bool IsWayTile(int x, int y)
  187. {
  188. return TileRoot.GetCellTileData(FloorMapLayer, new Vector2I(x, y)) != null;
  189. }
  190.  
  191. /// <summary>
  192. /// 返回指定坐标下对应的Tile是否为可以行走
  193. /// </summary>
  194. public bool IsWayPosition(float x, float y)
  195. {
  196. var tileMapCellSize = TileRoot.CellQuadrantSize;
  197. return IsWayTile((int)(x / tileMapCellSize), (int)(y / tileMapCellSize));
  198. }
  199.  
  200. /// <summary>
  201. /// 自动生成导航区域
  202. /// </summary>
  203. private void GenerateNavigationPolygon()
  204. {
  205. var size = new Vector2(TileRoot.CellQuadrantSize, TileRoot.CellQuadrantSize);
  206.  
  207. var rect = TileRoot.GetUsedRect();
  208.  
  209. var x = rect.Position.X;
  210. var y = rect.Position.Y;
  211. var w = rect.Size.X;
  212. var h = rect.Size.Y;
  213.  
  214. for (int j = y; j < h; j++)
  215. {
  216. for (int i = x; i < w; i++)
  217. {
  218. if (IsWayTile(i, j))
  219. {
  220. if (!_usePoints.Contains(new Vector2(i, j)))
  221. {
  222. NavigationPolygonData polygonData = null;
  223.  
  224. if (!IsWayTile(i, j - 1))
  225. {
  226. polygonData = CalcOutline(i, j, TileRoot, size);
  227. }
  228. else if (!IsWayTile(i, j + 1))
  229. {
  230. polygonData = CalcInline(i, j, TileRoot, size);
  231. }
  232.  
  233. if (polygonData != null)
  234. {
  235. _polygonDataList.Add(polygonData);
  236. }
  237. }
  238. }
  239. }
  240. }
  241. }
  242. //计算导航网格外轮廓
  243. private NavigationPolygonData CalcOutline(int i, int j, TileMap tileMap, Vector2 size)
  244. {
  245. var polygonData = new NavigationPolygonData();
  246. polygonData.Type = NavigationPolygonType.Out;
  247. var points = polygonData.Points;
  248. // 0:右, 1:下, 2:左, 3:上
  249. var dir = 0;
  250. var offset = new Vector2(size.X * 0.5f, size.Y * 0.5f);
  251. //找到路, 向右开始找边界
  252. var startPos = new Vector2(i, j);
  253.  
  254. var tempI = i;
  255. var tempJ = j;
  256.  
  257. while (true)
  258. {
  259. switch (dir)
  260. {
  261. case 0: //右
  262. {
  263. if (IsWayTile(tempI, tempJ - 1)) //先向上找
  264. {
  265. dir = 3;
  266.  
  267. var pos = new Vector2(tempI, tempJ);
  268. if (points.Count > 1 && pos == startPos)
  269. {
  270. return polygonData;
  271. }
  272.  
  273. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  274. PutUsePoint(pos);
  275.  
  276. tempJ--;
  277. break;
  278. }
  279. else if (IsWayTile(tempI + 1, tempJ)) //再向右找
  280. {
  281. if (points.Count == 0)
  282. {
  283. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  284. }
  285.  
  286. var pos = new Vector2(tempI, tempJ);
  287. if (points.Count > 1 && pos == startPos)
  288. {
  289. return polygonData;
  290. }
  291.  
  292. PutUsePoint(new Vector2(tempI, tempJ));
  293. tempI++;
  294. break;
  295. }
  296. else if (IsWayTile(tempI, tempJ + 1)) //向下找
  297. {
  298. dir = 1;
  299.  
  300. var pos = new Vector2(tempI, tempJ);
  301. if (points.Count > 1 && pos == startPos)
  302. {
  303. return polygonData;
  304. }
  305.  
  306. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  307. PutUsePoint(pos);
  308.  
  309. tempJ++;
  310. break;
  311. }
  312.  
  313. return null;
  314. }
  315. case 1: //下
  316. {
  317. if (IsWayTile(tempI + 1, tempJ)) //先向右找
  318. {
  319. dir = 0;
  320.  
  321. var pos = new Vector2(tempI, tempJ);
  322. if (points.Count > 1 && pos == startPos)
  323. {
  324. return polygonData;
  325. }
  326.  
  327. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  328. PutUsePoint(pos);
  329.  
  330. tempI++;
  331. break;
  332. }
  333. else if (IsWayTile(tempI, tempJ + 1)) //再向下找
  334. {
  335. if (points.Count == 0)
  336. {
  337. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  338. }
  339.  
  340. var pos = new Vector2(tempI, tempJ);
  341. if (points.Count > 1 && pos == startPos)
  342. {
  343. return polygonData;
  344. }
  345.  
  346. PutUsePoint(new Vector2(tempI, tempJ));
  347. tempJ++;
  348. break;
  349. }
  350. else if (IsWayTile(tempI - 1, tempJ)) //向左找
  351. {
  352. dir = 2;
  353.  
  354. var pos = new Vector2(tempI, tempJ);
  355. if (points.Count > 1 && pos == startPos)
  356. {
  357. return polygonData;
  358. }
  359.  
  360. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  361. PutUsePoint(pos);
  362.  
  363. tempI--;
  364. break;
  365. }
  366.  
  367. return null;
  368. }
  369. case 2: //左
  370. {
  371. if (IsWayTile(tempI, tempJ + 1)) //先向下找
  372. {
  373. dir = 1;
  374.  
  375. var pos = new Vector2(tempI, tempJ);
  376. if (points.Count > 1 && pos == startPos)
  377. {
  378. return polygonData;
  379. }
  380.  
  381. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  382. PutUsePoint(pos);
  383.  
  384. tempJ++;
  385. break;
  386. }
  387. else if (IsWayTile(tempI - 1, tempJ)) //再向左找
  388. {
  389. if (points.Count == 0)
  390. {
  391. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  392. }
  393.  
  394. var pos = new Vector2(tempI, tempJ);
  395. if (points.Count > 1 && pos == startPos)
  396. {
  397. return polygonData;
  398. }
  399.  
  400. PutUsePoint(new Vector2(tempI, tempJ));
  401. tempI--;
  402. break;
  403. }
  404. else if (IsWayTile(tempI, tempJ - 1)) //向上找
  405. {
  406. dir = 3;
  407.  
  408. var pos = new Vector2(tempI, tempJ);
  409. if (points.Count > 1 && pos == startPos)
  410. {
  411. return polygonData;
  412. }
  413.  
  414. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  415. PutUsePoint(pos);
  416.  
  417. tempJ--;
  418. break;
  419. }
  420.  
  421. return null;
  422. }
  423. case 3: //上
  424. {
  425. if (IsWayTile(tempI - 1, tempJ)) //先向左找
  426. {
  427. dir = 2;
  428.  
  429. var pos = new Vector2(tempI, tempJ);
  430. if (points.Count > 1 && pos == startPos)
  431. {
  432. return polygonData;
  433. }
  434.  
  435. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  436. PutUsePoint(pos);
  437.  
  438. tempI--;
  439. break;
  440. }
  441. else if (IsWayTile(tempI, tempJ - 1)) //再向上找
  442. {
  443. if (points.Count == 0)
  444. {
  445. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  446. }
  447.  
  448. var pos = new Vector2(tempI, tempJ);
  449. if (points.Count > 1 && pos == startPos)
  450. {
  451. return polygonData;
  452. }
  453.  
  454. PutUsePoint(new Vector2(tempI, tempJ));
  455. tempJ--;
  456. break;
  457. }
  458. else if (IsWayTile(tempI + 1, tempJ)) //向右找
  459. {
  460. dir = 0;
  461.  
  462. var pos = new Vector2(tempI, tempJ);
  463. if (points.Count > 1 && pos == startPos)
  464. {
  465. return polygonData;
  466. }
  467.  
  468. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  469. PutUsePoint(pos);
  470.  
  471. tempI++;
  472. break;
  473. }
  474.  
  475. return null;
  476. }
  477. }
  478. }
  479. }
  480.  
  481. //计算导航网格内轮廓
  482. private NavigationPolygonData CalcInline(int i, int j, TileMap tileMap, Vector2 size)
  483. {
  484. var polygonData = new NavigationPolygonData();
  485. polygonData.Type = NavigationPolygonType.In;
  486. var points = polygonData.Points;
  487. // 0:右, 1:下, 2:左, 3:上
  488. var dir = 0;
  489. var offset = new Vector2(size.X * 0.5f, size.Y * 0.5f);
  490. //找到路, 向右开始找边界
  491. var startPos = new Vector2(i - 1, j);
  492.  
  493. var tempI = i;
  494. var tempJ = j;
  495.  
  496. while (true)
  497. {
  498. switch (dir)
  499. {
  500. case 0: //右
  501. {
  502. if (IsWayTile(tempI, tempJ + 1)) //向下找
  503. {
  504. dir = 1;
  505.  
  506. var pos = new Vector2(tempI, tempJ);
  507. if (points.Count > 1 && pos == startPos)
  508. {
  509. return polygonData;
  510. }
  511.  
  512. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  513. PutUsePoint(pos);
  514.  
  515. tempJ++;
  516. break;
  517. }
  518. else if (IsWayTile(tempI + 1, tempJ)) //再向右找
  519. {
  520. if (points.Count == 0)
  521. {
  522. points.Add(new Vector2((tempI - 1) * size.X, tempJ * size.Y) + offset);
  523. }
  524.  
  525. var pos = new Vector2(tempI, tempJ);
  526. if (points.Count > 1 && pos == startPos)
  527. {
  528. return polygonData;
  529. }
  530.  
  531. PutUsePoint(new Vector2(tempI, tempJ));
  532. tempI++;
  533. break;
  534. }
  535. else if (IsWayTile(tempI, tempJ - 1)) //先向上找
  536. {
  537. dir = 3;
  538.  
  539. var pos = new Vector2(tempI, tempJ);
  540. if (points.Count > 1 && pos == startPos)
  541. {
  542. return polygonData;
  543. }
  544.  
  545. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  546. PutUsePoint(pos);
  547.  
  548. tempJ--;
  549. break;
  550. }
  551.  
  552. return null;
  553. }
  554. case 1: //下
  555. {
  556. if (IsWayTile(tempI - 1, tempJ)) //向左找
  557. {
  558. dir = 2;
  559.  
  560. var pos = new Vector2(tempI, tempJ);
  561. if (points.Count > 1 && pos == startPos)
  562. {
  563. return polygonData;
  564. }
  565.  
  566. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  567. PutUsePoint(pos);
  568.  
  569. tempI--;
  570. break;
  571. }
  572. else if (IsWayTile(tempI, tempJ + 1)) //再向下找
  573. {
  574. if (points.Count == 0)
  575. {
  576. points.Add(new Vector2((tempI - 1) * size.X, tempJ * size.Y) + offset);
  577. }
  578.  
  579. var pos = new Vector2(tempI, tempJ);
  580. if (points.Count > 1 && pos == startPos)
  581. {
  582. return polygonData;
  583. }
  584.  
  585. PutUsePoint(new Vector2(tempI, tempJ));
  586. tempJ++;
  587. break;
  588. }
  589. else if (IsWayTile(tempI + 1, tempJ)) //先向右找
  590. {
  591. dir = 0;
  592.  
  593. var pos = new Vector2(tempI, tempJ);
  594. if (points.Count > 1 && pos == startPos)
  595. {
  596. return polygonData;
  597. }
  598.  
  599. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  600. PutUsePoint(pos);
  601.  
  602. tempI++;
  603. break;
  604. }
  605.  
  606. return null;
  607. }
  608. case 2: //左
  609. {
  610. if (IsWayTile(tempI, tempJ - 1)) //向上找
  611. {
  612. dir = 3;
  613.  
  614. var pos = new Vector2(tempI, tempJ);
  615. if (points.Count > 1 && pos == startPos)
  616. {
  617. return polygonData;
  618. }
  619.  
  620. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  621. PutUsePoint(pos);
  622.  
  623. tempJ--;
  624. break;
  625. }
  626. else if (IsWayTile(tempI - 1, tempJ)) //再向左找
  627. {
  628. if (points.Count == 0)
  629. {
  630. points.Add(new Vector2((tempI - 1) * size.X, tempJ * size.Y) + offset);
  631. }
  632.  
  633. var pos = new Vector2(tempI, tempJ);
  634. if (points.Count > 1 && pos == startPos)
  635. {
  636. return polygonData;
  637. }
  638.  
  639. PutUsePoint(new Vector2(tempI, tempJ));
  640. tempI--;
  641. break;
  642. }
  643. else if (IsWayTile(tempI, tempJ + 1)) //先向下找
  644. {
  645. dir = 1;
  646.  
  647. var pos = new Vector2(tempI, tempJ);
  648. if (points.Count > 1 && pos == startPos)
  649. {
  650. return polygonData;
  651. }
  652.  
  653. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  654. PutUsePoint(pos);
  655.  
  656. tempJ++;
  657. break;
  658. }
  659.  
  660. return null;
  661. }
  662. case 3: //上
  663. {
  664. if (IsWayTile(tempI + 1, tempJ)) //向右找
  665. {
  666. dir = 0;
  667.  
  668. var pos = new Vector2(tempI, tempJ);
  669. if (points.Count > 1 && pos == startPos)
  670. {
  671. return polygonData;
  672. }
  673.  
  674. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  675. PutUsePoint(pos);
  676.  
  677. tempI++;
  678. break;
  679. }
  680. else if (IsWayTile(tempI, tempJ - 1)) //再向上找
  681. {
  682. if (points.Count == 0)
  683. {
  684. points.Add(new Vector2((tempI - 1) * size.X, tempJ * size.Y) + offset);
  685. }
  686.  
  687. var pos = new Vector2(tempI, tempJ);
  688. if (points.Count > 1 && pos == startPos)
  689. {
  690. return polygonData;
  691. }
  692.  
  693. PutUsePoint(new Vector2(tempI, tempJ));
  694. tempJ--;
  695. break;
  696. }
  697. else if (IsWayTile(tempI - 1, tempJ)) //先向左找
  698. {
  699. dir = 2;
  700.  
  701. var pos = new Vector2(tempI, tempJ);
  702. if (points.Count > 1 && pos == startPos)
  703. {
  704. return polygonData;
  705. }
  706.  
  707. points.Add(new Vector2(tempI * size.X, tempJ * size.Y) + offset);
  708. PutUsePoint(pos);
  709.  
  710. tempI--;
  711. break;
  712. }
  713.  
  714. return null;
  715. }
  716. }
  717. }
  718. }
  719.  
  720. //记录导航网格中已经使用过的坐标
  721. private void PutUsePoint(Vector2 pos)
  722. {
  723. if (_usePoints.Contains(pos))
  724. {
  725. throw new Exception("生成导航多边形发生错误! 点: " + pos + "发生交错!");
  726. }
  727.  
  728. _usePoints.Add(pos);
  729. }
  730. //绘制房间区域, debug 用
  731. private void DrawRoomInfo(RoomInfo room)
  732. {
  733. var cellSize = TileRoot.CellQuadrantSize;
  734. var pos1 = (room.Position + room.Size / 2) * cellSize;
  735. //绘制下一个房间
  736. foreach (var nextRoom in room.Next)
  737. {
  738. var pos2 = (nextRoom.Position + nextRoom.Size / 2) * cellSize;
  739. DrawLine(pos1, pos2, Colors.Red);
  740. DrawRoomInfo(nextRoom);
  741. }
  742.  
  743. DrawString(_font, pos1, room.Id.ToString());
  744.  
  745. //绘制门
  746. foreach (var roomDoor in room.Doors)
  747. {
  748. var originPos = roomDoor.OriginPosition * cellSize;
  749. switch (roomDoor.Direction)
  750. {
  751. case DoorDirection.E:
  752. DrawLine(originPos, originPos + new Vector2(3, 0) * cellSize, Colors.Yellow);
  753. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos + new Vector2(3, 4) * cellSize,
  754. Colors.Yellow);
  755. break;
  756. case DoorDirection.W:
  757. DrawLine(originPos, originPos - new Vector2(3, 0) * cellSize, Colors.Yellow);
  758. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos - new Vector2(3, -4) * cellSize,
  759. Colors.Yellow);
  760. break;
  761. case DoorDirection.S:
  762. DrawLine(originPos, originPos + new Vector2(0, 3) * cellSize, Colors.Yellow);
  763. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos + new Vector2(4, 3) * cellSize,
  764. Colors.Yellow);
  765. break;
  766. case DoorDirection.N:
  767. DrawLine(originPos, originPos - new Vector2(0, 3) * cellSize, Colors.Yellow);
  768. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos - new Vector2(-4, 3) * cellSize,
  769. Colors.Yellow);
  770. break;
  771. }
  772. //绘制房间区域
  773. DrawRect(new Rect2(room.Position * cellSize, room.Size * cellSize), Colors.Blue, false);
  774.  
  775. if (roomDoor.HasCross && roomDoor.RoomInfo.Id < roomDoor.ConnectRoom.Id)
  776. {
  777. DrawRect(new Rect2(roomDoor.Cross * cellSize, new Vector2(cellSize * 4, cellSize * 4)), Colors.Yellow, false);
  778. }
  779. }
  780. }
  781. }