Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / room / RoomManager.cs
  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. /// <summary>
  12. /// //对象根节点
  13. /// </summary>
  14. [Export] public Node2D NormalLayer;
  15. /// <summary>
  16. /// 对象根节点, 带y轴排序功能
  17. /// </summary>
  18. [Export] public Node2D YSortLayer;
  19. /// <summary>
  20. /// 地图根节点
  21. /// </summary>
  22. [Export] public TileMap TileRoot;
  23.  
  24. /// <summary>
  25. /// 玩家对象
  26. /// </summary>
  27. public Player Player { get; private set; }
  28. private DungeonTile _dungeonTile;
  29. private AutoTileConfig _autoTileConfig;
  30. private Font _font;
  31. private GenerateDungeon _generateDungeon;
  32.  
  33. //房间内所有导航网格数据
  34. private List<NavigationPolygonData> _roomNavDataList = new List<NavigationPolygonData>();
  35.  
  36. public override void _EnterTree()
  37. {
  38. //创建玩家
  39. Player = new Player();
  40. Player.Position = new Vector2(30, 30);
  41. Player.Name = "Player";
  42. Player.PutDown(RoomLayerEnum.YSortLayer);
  43. }
  44.  
  45. public override void _Ready()
  46. {
  47. TileRoot.YSortEnabled = false;
  48. //FloorTileMap.NavigationVisibilityMode = TileMap.VisibilityMode.ForceShow;
  49. _font = ResourceManager.Load<Font>(ResourcePath.resource_font_cn_font_36_tres);
  50.  
  51. var nowTicks = DateTime.Now.Ticks;
  52. //生成地牢房间
  53. _generateDungeon = new GenerateDungeon();
  54. _generateDungeon.Generate();
  55. //填充地牢
  56. _autoTileConfig = new AutoTileConfig();
  57. _dungeonTile = new DungeonTile(TileRoot);
  58. _dungeonTile.AutoFillRoomTile(_autoTileConfig, _generateDungeon.StartRoom);
  59. //生成寻路网格
  60. _dungeonTile.GenerateNavigationPolygon(DungeonTile.AisleFloorLayer);
  61. //挂载导航区域
  62. _dungeonTile.MountNavigationPolygon(this);
  63. _roomNavDataList.AddRange(_dungeonTile.GetPolygonData());
  64. //挂载所有导航区域
  65. _generateDungeon.EachRoom(MountNavFromRoomInfo);
  66. GD.Print("生成地牢用时: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒");
  67.  
  68. //播放bgm
  69. SoundManager.PlayMusic(ResourcePath.resource_sound_bgm_Intro_ogg, -17f);
  70.  
  71. Player.PickUpWeapon(WeaponManager.GetGun("1001"));
  72. // Player.PickUpWeapon(WeaponManager.GetGun("1002"));
  73. Player.PickUpWeapon(WeaponManager.GetGun("1004"));
  74. Player.PickUpWeapon(WeaponManager.GetGun("1003"));
  75. // var enemy1 = new Enemy();
  76. // enemy1.PutDown(new Vector2(160, 160), RoomLayerEnum.YSortLayer);
  77. // enemy1.PickUpWeapon(WeaponManager.GetGun("1001"));
  78. // for (int i = 0; i < 10; i++)
  79. // {
  80. // var enemyTemp = new Enemy();
  81. // enemyTemp.PutDown(new Vector2(30 + (i + 1) * 20, 30), RoomLayerEnum.YSortLayer);
  82. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1003"));
  83. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1001"));
  84. // }
  85.  
  86. // var enemy2 = new Enemy();
  87. // enemy2.Name = "Enemy2";
  88. // enemy2.PutDown(new Vector2(120, 100));
  89. // enemy2.PickUpWeapon(WeaponManager.GetGun("1002"));
  90. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1004"));
  91. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1003"));
  92. //
  93. // var enemy3 = new Enemy();
  94. // enemy3.Name = "Enemy3";
  95. // enemy3.PutDown(new Vector2(100, 120));
  96. // enemy3.PickUpWeapon(WeaponManager.GetGun("1003"));
  97. // enemy3.PickUpWeapon(WeaponManager.GetGun("1002"));
  98.  
  99. // WeaponManager.GetGun("1004").PutDown(new Vector2(80, 100), RoomLayerEnum.NormalLayer);
  100. // WeaponManager.GetGun("1001").PutDown(new Vector2(220, 120), RoomLayerEnum.NormalLayer);
  101. // WeaponManager.GetGun("1001").PutDown(new Vector2(230, 120), RoomLayerEnum.NormalLayer);
  102. // WeaponManager.GetGun("1001").PutDown(new Vector2(80, 80), RoomLayerEnum.NormalLayer);
  103. // WeaponManager.GetGun("1002").PutDown(new Vector2(80, 120), RoomLayerEnum.NormalLayer);
  104. // WeaponManager.GetGun("1003").PutDown(new Vector2(120, 80), RoomLayerEnum.NormalLayer);
  105. // WeaponManager.GetGun("1003").PutDown(new Vector2(130, 80), RoomLayerEnum.NormalLayer);
  106. // WeaponManager.GetGun("1003").PutDown(new Vector2(140, 80), RoomLayerEnum.NormalLayer);
  107. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 80), RoomLayerEnum.NormalLayer);
  108. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 180), RoomLayerEnum.NormalLayer);
  109. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 120), RoomLayerEnum.NormalLayer);
  110. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 130), RoomLayerEnum.NormalLayer);
  111.  
  112. }
  113.  
  114. /// <summary>
  115. /// 获取指定层级根节点
  116. /// </summary>
  117. /// <param name="layerEnum"></param>
  118. /// <returns></returns>
  119. public Node2D GetRoomLayer(RoomLayerEnum layerEnum)
  120. {
  121. switch (layerEnum)
  122. {
  123. case RoomLayerEnum.NormalLayer:
  124. return NormalLayer;
  125. case RoomLayerEnum.YSortLayer:
  126. return YSortLayer;
  127. }
  128.  
  129. return null;
  130. }
  131.  
  132. public override void _Process(double delta)
  133. {
  134. Enemy.UpdateEnemiesView();
  135. if (GameApplication.Instance.Debug)
  136. {
  137. QueueRedraw();
  138. }
  139. }
  140.  
  141. public override void _Draw()
  142. {
  143. if (GameApplication.Instance.Debug)
  144. {
  145. if (_dungeonTile != null)
  146. {
  147. // DrawLine(new Vector2(0, -5000), new Vector2(0, 5000), Colors.Green);
  148. // DrawLine(new Vector2(-5000, 0), new Vector2(5000, 0), Colors.Green);
  149. //绘制ai寻路区域
  150. Utils.DrawNavigationPolygon(this, _roomNavDataList.ToArray());
  151. }
  152. //绘制房间区域
  153. //DrawRoomInfo(_generateDungeon.StartRoom);
  154. }
  155. }
  156.  
  157. private void MountNavFromRoomInfo(RoomInfo roomInfo)
  158. {
  159. var polygonArray = roomInfo.RoomSplit.RoomInfo.NavigationList.ToArray();
  160. var polygon = new NavigationPolygon();
  161. for (var i = 0; i < polygonArray.Length; i++)
  162. {
  163. var navigationPolygonData = polygonArray[i];
  164. var polygonPointArray = navigationPolygonData.ConvertPointsToVector2Array();
  165. //这里的位置需要加上房间位置
  166. for (var j = 0; j < polygonPointArray.Length; j++)
  167. {
  168. polygonPointArray[j] = polygonPointArray[j] + (roomInfo.Position + Vector2I.One) * GenerateDungeon.TileCellSize;
  169. }
  170. polygon.AddOutline(polygonPointArray);
  171. //存入汇总列表
  172. _roomNavDataList.Add(new NavigationPolygonData()
  173. {
  174. Type = navigationPolygonData.Type,
  175. Points = polygonPointArray.Select(point => new SerializeVector2(point)).ToList(),
  176. });
  177. }
  178. polygon.MakePolygonsFromOutlines();
  179. var navigationPolygon = new NavigationRegion2D();
  180. navigationPolygon.Name = "NavigationRegion" + (GetChildCount() + 1);
  181. navigationPolygon.NavigationPolygon = polygon;
  182. AddChild(navigationPolygon);
  183. }
  184. //绘制房间区域, debug 用
  185. private void DrawRoomInfo(RoomInfo room)
  186. {
  187. var cellSize = TileRoot.CellQuadrantSize;
  188. var pos1 = (room.Position + room.Size / 2) * cellSize;
  189. //绘制下一个房间
  190. foreach (var nextRoom in room.Next)
  191. {
  192. var pos2 = (nextRoom.Position + nextRoom.Size / 2) * cellSize;
  193. DrawLine(pos1, pos2, Colors.Red);
  194. DrawRoomInfo(nextRoom);
  195. }
  196.  
  197. DrawString(_font, pos1, room.Id.ToString());
  198.  
  199. //绘制门
  200. foreach (var roomDoor in room.Doors)
  201. {
  202. var originPos = roomDoor.OriginPosition * cellSize;
  203. switch (roomDoor.Direction)
  204. {
  205. case DoorDirection.E:
  206. DrawLine(originPos, originPos + new Vector2(3, 0) * cellSize, Colors.Yellow);
  207. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos + new Vector2(3, 4) * cellSize,
  208. Colors.Yellow);
  209. break;
  210. case DoorDirection.W:
  211. DrawLine(originPos, originPos - new Vector2(3, 0) * cellSize, Colors.Yellow);
  212. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos - new Vector2(3, -4) * cellSize,
  213. Colors.Yellow);
  214. break;
  215. case DoorDirection.S:
  216. DrawLine(originPos, originPos + new Vector2(0, 3) * cellSize, Colors.Yellow);
  217. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos + new Vector2(4, 3) * cellSize,
  218. Colors.Yellow);
  219. break;
  220. case DoorDirection.N:
  221. DrawLine(originPos, originPos - new Vector2(0, 3) * cellSize, Colors.Yellow);
  222. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos - new Vector2(-4, 3) * cellSize,
  223. Colors.Yellow);
  224. break;
  225. }
  226. //绘制房间区域
  227. DrawRect(new Rect2(room.Position * cellSize, room.Size * cellSize), Colors.Blue, false);
  228.  
  229. if (roomDoor.HasCross && roomDoor.RoomInfo.Id < roomDoor.ConnectRoom.Id)
  230. {
  231. DrawRect(new Rect2(roomDoor.Cross * cellSize, new Vector2(cellSize * 4, cellSize * 4)), Colors.Yellow, false);
  232. }
  233. }
  234. }
  235. }