Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / RoomInfo.cs
@lijincheng lijincheng on 27 May 2023 6 KB 关门后房间外的敌人丢失目标
  1.  
  2. using System.Collections.Generic;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 房间的数据描述
  7. /// </summary>
  8. public class RoomInfo : IDestroy
  9. {
  10. public RoomInfo(int id, DungeonRoomType type, DungeonRoomSplit roomSplit)
  11. {
  12. Id = id;
  13. RoomType = type;
  14. RoomSplit = roomSplit;
  15. }
  16.  
  17. /// <summary>
  18. /// 房间 id
  19. /// </summary>
  20. public int Id;
  21.  
  22. /// <summary>
  23. /// 房间类型
  24. /// </summary>
  25. public DungeonRoomType RoomType;
  26.  
  27. /// <summary>
  28. /// 层级, 也就是离初始房间间隔多少个房间
  29. /// </summary>
  30. public int Layer;
  31. /// <summary>
  32. /// 生成该房间使用的配置数据
  33. /// </summary>
  34. public DungeonRoomSplit RoomSplit;
  35. /// <summary>
  36. /// 房间大小, 单位: 格
  37. /// </summary>
  38. public Vector2I Size;
  39.  
  40. /// <summary>
  41. /// 房间位置, 单位: 格
  42. /// </summary>
  43. public Vector2I Position;
  44. /// <summary>
  45. /// 门
  46. /// </summary>
  47. public List<RoomDoorInfo> Doors = new List<RoomDoorInfo>();
  48.  
  49. /// <summary>
  50. /// 连接该房间的过道占用区域信息
  51. /// </summary>
  52. public List<Rect2> AisleArea = new List<Rect2>();
  53.  
  54. /// <summary>
  55. /// 下一个房间
  56. /// </summary>
  57. public List<RoomInfo> Next = new List<RoomInfo>();
  58. /// <summary>
  59. /// 上一个房间
  60. /// </summary>
  61. public RoomInfo Prev;
  62.  
  63. /// <summary>
  64. /// 物体生成标记
  65. /// </summary>
  66. public List<ActivityMark> ActivityMarks = new List<ActivityMark>();
  67.  
  68. /// <summary>
  69. /// 当前房间归属区域
  70. /// </summary>
  71. public AffiliationArea Affiliation;
  72.  
  73. /// <summary>
  74. /// 是否处于闭关状态, 也就是房间门没有主动打开
  75. /// </summary>
  76. public bool IsSeclusion { get; private set; } = false;
  77. public bool IsDestroyed { get; private set; }
  78. private bool _beReady = false;
  79. private bool _waveStart = false;
  80. private int _currWaveIndex = 0;
  81. private int _currWaveNumber = 0;
  82. private List<ActivityMark> _currActivityMarks = new List<ActivityMark>();
  83.  
  84. /// <summary>
  85. /// 获取房间的全局坐标, 单位: 像素
  86. /// </summary>
  87. public Vector2 GetWorldPosition()
  88. {
  89. return new Vector2(
  90. Position.X * GameConfig.TileCellSize,
  91. Position.Y * GameConfig.TileCellSize
  92. );
  93. }
  94.  
  95. /// <summary>
  96. /// 获取房间左上角的 Tile 距离全局坐标原点的偏移, 单位: 像素
  97. /// </summary>
  98. /// <returns></returns>
  99. public Vector2 GetOffsetPosition()
  100. {
  101. return RoomSplit.RoomInfo.Position.AsVector2() * GameConfig.TileCellSize;
  102. }
  103. /// <summary>
  104. /// 获取房间横轴结束位置, 单位: 格
  105. /// </summary>
  106. public int GetHorizontalEnd()
  107. {
  108. return Position.X + Size.X;
  109. }
  110.  
  111. /// <summary>
  112. /// 获取房间纵轴结束位置, 单位: 格
  113. /// </summary>
  114. public int GetVerticalEnd()
  115. {
  116. return Position.Y + Size.Y;
  117. }
  118. /// <summary>
  119. /// 获取房间横轴开始位置, 单位: 格
  120. /// </summary>
  121. public int GetHorizontalStart()
  122. {
  123. return Position.X;
  124. }
  125.  
  126. /// <summary>
  127. /// 获取房间纵轴开始位置, 单位: 格
  128. /// </summary>
  129. public int GetVerticalStart()
  130. {
  131. return Position.Y;
  132. }
  133. public void Destroy()
  134. {
  135. if (IsDestroyed)
  136. {
  137. return;
  138. }
  139.  
  140. IsDestroyed = true;
  141. foreach (var nextRoom in Next)
  142. {
  143. nextRoom.Destroy();
  144. }
  145. Next.Clear();
  146. foreach (var activityMark in ActivityMarks)
  147. {
  148. activityMark.QueueFree();
  149. }
  150. ActivityMarks.Clear();
  151. }
  152. /// <summary>
  153. /// 房间准备好了, 准备刷敌人, 并且关闭所有门,
  154. /// 当清完每一波刷新的敌人后即可开门
  155. /// </summary>
  156. public void BeReady()
  157. {
  158. //没有标记, 啥都不要做
  159. if (ActivityMarks.Count == 0)
  160. {
  161. _beReady = true;
  162. IsSeclusion = false;
  163. return;
  164. }
  165. IsSeclusion = true;
  166. _waveStart = false;
  167.  
  168. if (!_beReady)
  169. {
  170. _beReady = true;
  171. //按照 WaveNumber 排序
  172. ActivityMarks.Sort((x, y) =>
  173. {
  174. return x.WaveNumber - y.WaveNumber;
  175. });
  176. }
  177.  
  178. //不是初始房间才能关门
  179. if (RoomSplit.RoomInfo.RoomType != DungeonRoomType.Inlet)
  180. {
  181. //关门
  182. foreach (var doorInfo in Doors)
  183. {
  184. doorInfo.Door.CloseDoor();
  185. }
  186. }
  187. //执行第一波生成
  188. NextWave();
  189. }
  190.  
  191. /// <summary>
  192. /// 当前房间所有敌人都被清除了
  193. /// </summary>
  194. public void OnClearRoom()
  195. {
  196. if (_currWaveIndex >= ActivityMarks.Count) //所有 mark 都走完了
  197. {
  198. IsSeclusion = false;
  199. _currActivityMarks.Clear();
  200. //开门
  201. if (RoomSplit.RoomInfo.RoomType != DungeonRoomType.Inlet)
  202. {
  203. foreach (var doorInfo in Doors)
  204. {
  205. doorInfo.Door.OpenDoor();
  206. }
  207. }
  208. }
  209. else //执行下一波
  210. {
  211. NextWave();
  212. }
  213. }
  214.  
  215. /// <summary>
  216. /// 返回当前这一波所有的标记的 Doing 函数是否执行完成
  217. /// </summary>
  218. public bool IsCurrWaveOver()
  219. {
  220. for (var i = 0; i < _currActivityMarks.Count; i++)
  221. {
  222. if (!_currActivityMarks[i].IsOver())
  223. {
  224. return false;
  225. }
  226. }
  227.  
  228. return true;
  229. }
  230.  
  231. /// <summary>
  232. /// 执行下一轮标记
  233. /// </summary>
  234. private void NextWave()
  235. {
  236. if (!_waveStart)
  237. {
  238. _waveStart = true;
  239. _currWaveIndex = 0;
  240. _currWaveNumber = ActivityMarks[0].WaveNumber;
  241. }
  242. GD.Print("执行下一波, 当前: " + _currWaveNumber);
  243. _currActivityMarks.Clear();
  244. //根据标记生成对象
  245. for (; _currWaveIndex < ActivityMarks.Count; _currWaveIndex++)
  246. {
  247. var mark = ActivityMarks[_currWaveIndex];
  248. if (mark.WaveNumber != _currWaveNumber) //当前这波已经执行完成了
  249. {
  250. _currWaveNumber = mark.WaveNumber;
  251. break;
  252. }
  253. else //生成操作
  254. {
  255. mark.BeReady(this);
  256. _currActivityMarks.Add(mark);
  257. }
  258. }
  259. }
  260. }