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.  
  29. /// <summary>
  30. /// 导航区域形状
  31. /// </summary>
  32. public NavigationRegion2D NavigationPolygon { get; private set; }
  33.  
  34.  
  35. private DungeonTile _dungeonTile;
  36. private AutoTileConfig _autoTileConfig;
  37. private Font _font;
  38. private GenerateDungeon _generateDungeon;
  39.  
  40. public override void _EnterTree()
  41. {
  42. NavigationPolygon = new NavigationRegion2D();
  43. AddChild(NavigationPolygon);
  44. //创建玩家
  45. Player = new Player();
  46. Player.Position = new Vector2(30, 30);
  47. Player.Name = "Player";
  48. Player.PutDown(RoomLayerEnum.YSortLayer);
  49. }
  50.  
  51. public override void _Ready()
  52. {
  53. TileRoot.YSortEnabled = false;
  54. //FloorTileMap.NavigationVisibilityMode = TileMap.VisibilityMode.ForceShow;
  55. _font = ResourceManager.Load<Font>(ResourcePath.resource_font_cn_font_36_tres);
  56.  
  57. //生成地牢房间
  58. _generateDungeon = new GenerateDungeon();
  59. _generateDungeon.Generate();
  60. //填充地牢
  61. _autoTileConfig = new AutoTileConfig();
  62. _dungeonTile = new DungeonTile(TileRoot);
  63. _dungeonTile.AutoFillRoomTile(_autoTileConfig, _generateDungeon.StartRoom);
  64.  
  65. //根据房间数据创建填充 tiled
  66. var nowTicks = DateTime.Now.Ticks;
  67. //生成寻路网格
  68. _dungeonTile.GenerateNavigationPolygon(NavigationPolygon);
  69. GD.Print("计算NavigationPolygon用时: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒");
  70.  
  71. //播放bgm
  72. SoundManager.PlayMusic(ResourcePath.resource_sound_bgm_Intro_ogg, -17f);
  73.  
  74. Player.PickUpWeapon(WeaponManager.GetGun("1001"));
  75. // Player.PickUpWeapon(WeaponManager.GetGun("1002"));
  76. Player.PickUpWeapon(WeaponManager.GetGun("1004"));
  77. Player.PickUpWeapon(WeaponManager.GetGun("1003"));
  78. var enemy1 = new Enemy();
  79. enemy1.PutDown(new Vector2(150, 150), RoomLayerEnum.YSortLayer);
  80. enemy1.PickUpWeapon(WeaponManager.GetGun("1001"));
  81. // for (int i = 0; i < 10; i++)
  82. // {
  83. // var enemyTemp = new Enemy();
  84. // enemyTemp.PutDown(new Vector2(30 + (i + 1) * 20, 30), RoomLayerEnum.YSortLayer);
  85. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1003"));
  86. // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1001"));
  87. // }
  88.  
  89. // var enemy2 = new Enemy();
  90. // enemy2.Name = "Enemy2";
  91. // enemy2.PutDown(new Vector2(120, 100));
  92. // enemy2.PickUpWeapon(WeaponManager.GetGun("1002"));
  93. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1004"));
  94. // //enemy2.PickUpWeapon(WeaponManager.GetGun("1003"));
  95. //
  96. // var enemy3 = new Enemy();
  97. // enemy3.Name = "Enemy3";
  98. // enemy3.PutDown(new Vector2(100, 120));
  99. // enemy3.PickUpWeapon(WeaponManager.GetGun("1003"));
  100. // enemy3.PickUpWeapon(WeaponManager.GetGun("1002"));
  101.  
  102. // WeaponManager.GetGun("1004").PutDown(new Vector2(80, 100), RoomLayerEnum.NormalLayer);
  103. // WeaponManager.GetGun("1001").PutDown(new Vector2(220, 120), RoomLayerEnum.NormalLayer);
  104. // WeaponManager.GetGun("1001").PutDown(new Vector2(230, 120), RoomLayerEnum.NormalLayer);
  105. // WeaponManager.GetGun("1001").PutDown(new Vector2(80, 80), RoomLayerEnum.NormalLayer);
  106. // WeaponManager.GetGun("1002").PutDown(new Vector2(80, 120), RoomLayerEnum.NormalLayer);
  107. // WeaponManager.GetGun("1003").PutDown(new Vector2(120, 80), RoomLayerEnum.NormalLayer);
  108. // WeaponManager.GetGun("1003").PutDown(new Vector2(130, 80), RoomLayerEnum.NormalLayer);
  109. // WeaponManager.GetGun("1003").PutDown(new Vector2(140, 80), RoomLayerEnum.NormalLayer);
  110. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 80), RoomLayerEnum.NormalLayer);
  111. // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 180), RoomLayerEnum.NormalLayer);
  112. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 120), RoomLayerEnum.NormalLayer);
  113. // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 130), RoomLayerEnum.NormalLayer);
  114.  
  115. }
  116.  
  117. /// <summary>
  118. /// 获取指定层级根节点
  119. /// </summary>
  120. /// <param name="layerEnum"></param>
  121. /// <returns></returns>
  122. public Node2D GetRoomLayer(RoomLayerEnum layerEnum)
  123. {
  124. switch (layerEnum)
  125. {
  126. case RoomLayerEnum.NormalLayer:
  127. return NormalLayer;
  128. case RoomLayerEnum.YSortLayer:
  129. return YSortLayer;
  130. }
  131.  
  132. return null;
  133. }
  134.  
  135. public override void _Process(double delta)
  136. {
  137. Enemy.UpdateEnemiesView();
  138. if (GameApplication.Instance.Debug)
  139. {
  140. QueueRedraw();
  141. }
  142. }
  143.  
  144. public override void _Draw()
  145. {
  146. if (GameApplication.Instance.Debug)
  147. {
  148. if (_dungeonTile != null)
  149. {
  150. //绘制ai寻路区域
  151. foreach (var item in _dungeonTile.GetPolygonData())
  152. {
  153. if (item.Points.Count >= 2)
  154. {
  155. DrawPolyline(item.Points.Concat(new []{ item.Points[0] }).ToArray(), Colors.Red);
  156. }
  157. }
  158. }
  159. //绘制房间区域
  160. DrawRoomInfo(_generateDungeon.StartRoom);
  161. }
  162. }
  163.  
  164. //绘制房间区域, debug 用
  165. private void DrawRoomInfo(RoomInfo room)
  166. {
  167. var cellSize = TileRoot.CellQuadrantSize;
  168. var pos1 = (room.Position + room.Size / 2) * cellSize;
  169. //绘制下一个房间
  170. foreach (var nextRoom in room.Next)
  171. {
  172. var pos2 = (nextRoom.Position + nextRoom.Size / 2) * cellSize;
  173. DrawLine(pos1, pos2, Colors.Red);
  174. DrawRoomInfo(nextRoom);
  175. }
  176.  
  177. DrawString(_font, pos1, room.Id.ToString());
  178.  
  179. //绘制门
  180. foreach (var roomDoor in room.Doors)
  181. {
  182. var originPos = roomDoor.OriginPosition * cellSize;
  183. switch (roomDoor.Direction)
  184. {
  185. case DoorDirection.E:
  186. DrawLine(originPos, originPos + new Vector2(3, 0) * cellSize, Colors.Yellow);
  187. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos + new Vector2(3, 4) * cellSize,
  188. Colors.Yellow);
  189. break;
  190. case DoorDirection.W:
  191. DrawLine(originPos, originPos - new Vector2(3, 0) * cellSize, Colors.Yellow);
  192. DrawLine(originPos + new Vector2(0, 4) * cellSize, originPos - new Vector2(3, -4) * cellSize,
  193. Colors.Yellow);
  194. break;
  195. case DoorDirection.S:
  196. DrawLine(originPos, originPos + new Vector2(0, 3) * cellSize, Colors.Yellow);
  197. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos + new Vector2(4, 3) * cellSize,
  198. Colors.Yellow);
  199. break;
  200. case DoorDirection.N:
  201. DrawLine(originPos, originPos - new Vector2(0, 3) * cellSize, Colors.Yellow);
  202. DrawLine(originPos + new Vector2(4, 0) * cellSize, originPos - new Vector2(-4, 3) * cellSize,
  203. Colors.Yellow);
  204. break;
  205. }
  206. //绘制房间区域
  207. DrawRect(new Rect2(room.Position * cellSize, room.Size * cellSize), Colors.Blue, false);
  208.  
  209. if (roomDoor.HasCross && roomDoor.RoomInfo.Id < roomDoor.ConnectRoom.Id)
  210. {
  211. DrawRect(new Rect2(roomDoor.Cross * cellSize, new Vector2(cellSize * 4, cellSize * 4)), Colors.Yellow, false);
  212. }
  213. }
  214. }
  215. }