Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / room / RoomInfo.cs
  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<Rect2I> AisleArea = new List<Rect2I>();
  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 RoomPreinstall RoomPreinstall;
  67.  
  68. /// <summary>
  69. /// 当前房间归属区域
  70. /// </summary>
  71. public AffiliationArea AffiliationArea;
  72.  
  73. /// <summary>
  74. /// 静态精灵绘制画布
  75. /// </summary>
  76. public RoomStaticImageCanvas StaticImageCanvas;
  77.  
  78. /// <summary>
  79. /// 是否处于闭关状态, 也就是房间门没有主动打开
  80. /// </summary>
  81. public bool IsSeclusion { get; private set; } = false;
  82. public bool IsDestroyed { get; private set; }
  83. // private bool _beReady = false;
  84. // private bool _waveStart = false;
  85. // private int _currWaveIndex = 0;
  86. // private int _currWaveNumber = 0;
  87. //private List<ActivityMark> _currActivityMarks = new List<ActivityMark>();
  88.  
  89. /// <summary>
  90. /// 获取房间的全局坐标, 单位: 像素
  91. /// </summary>
  92. public Vector2I GetWorldPosition()
  93. {
  94. return new Vector2I(
  95. Position.X * GameConfig.TileCellSize,
  96. Position.Y * GameConfig.TileCellSize
  97. );
  98. }
  99.  
  100. /// <summary>
  101. /// 获取房间左上角的 Tile 距离全局坐标原点的偏移, 单位: 像素
  102. /// </summary>
  103. /// <returns></returns>
  104. public Vector2I GetOffsetPosition()
  105. {
  106. return RoomSplit.RoomInfo.Position.AsVector2I() * GameConfig.TileCellSize;
  107. }
  108. /// <summary>
  109. /// 获取房间横轴结束位置, 单位: 格
  110. /// </summary>
  111. public int GetHorizontalEnd()
  112. {
  113. return Position.X + Size.X;
  114. }
  115.  
  116. /// <summary>
  117. /// 获取房间纵轴结束位置, 单位: 格
  118. /// </summary>
  119. public int GetVerticalEnd()
  120. {
  121. return Position.Y + Size.Y;
  122. }
  123. /// <summary>
  124. /// 获取房间横轴开始位置, 单位: 格
  125. /// </summary>
  126. public int GetHorizontalStart()
  127. {
  128. return Position.X;
  129. }
  130.  
  131. /// <summary>
  132. /// 获取房间纵轴开始位置, 单位: 格
  133. /// </summary>
  134. public int GetVerticalStart()
  135. {
  136. return Position.Y;
  137. }
  138.  
  139. /// <summary>
  140. /// 获取房间宽度, 单位: 像素
  141. /// </summary>
  142. public int GetWidth()
  143. {
  144. return Size.X * GameConfig.TileCellSize;
  145. }
  146. /// <summary>
  147. /// 获取房间高度, 单位: 像素
  148. /// </summary>
  149. public int GetHeight()
  150. {
  151. return Size.Y * GameConfig.TileCellSize;
  152. }
  153. public void Destroy()
  154. {
  155. if (IsDestroyed)
  156. {
  157. return;
  158. }
  159.  
  160. IsDestroyed = true;
  161. foreach (var nextRoom in Next)
  162. {
  163. nextRoom.Destroy();
  164. }
  165. Next.Clear();
  166. if (RoomPreinstall != null)
  167. {
  168. RoomPreinstall.Destroy();
  169. RoomPreinstall = null;
  170. }
  171. if (StaticImageCanvas != null)
  172. {
  173. StaticImageCanvas.Destroy();
  174. }
  175. AffiliationArea.Destroy();
  176. }
  177. /// <summary>
  178. /// 加载地牢完成
  179. /// </summary>
  180. public void OnReady()
  181. {
  182. //提前加载波
  183. RoomPreinstall.OnReady();
  184. }
  185. /// <summary>
  186. /// 玩家第一次进入房间, 房间准备好了, 准备刷敌人, 并且关闭所有<br/>
  187. /// 当清完每一波刷新的敌人后即可开门
  188. /// </summary>
  189. public void OnFirstEnter()
  190. {
  191. if (RoomPreinstall.IsRunWave)
  192. {
  193. return;
  194. }
  195. //房间内有敌人, 或者会刷新敌人才会关门
  196. var hasEnemy = false;
  197. if (AffiliationArea.ExistEnterItem(activityObject => activityObject.CollisionWithMask(PhysicsLayer.Enemy))) //先判断房间里面是否有敌人
  198. {
  199. hasEnemy = true;
  200. }
  201. else if (RoomPreinstall.HasEnemy()) //在判断是否会刷出敌人
  202. {
  203. hasEnemy = true;
  204. }
  205.  
  206. if (!hasEnemy) //没有敌人, 不关门
  207. {
  208. IsSeclusion = false;
  209. //执行第一波生成
  210. RoomPreinstall.StartWave();
  211. return;
  212. }
  213. //关门
  214. foreach (var doorInfo in Doors)
  215. {
  216. doorInfo.Door.CloseDoor();
  217. }
  218. IsSeclusion = true;
  219.  
  220. //执行第一波生成
  221. RoomPreinstall.StartWave();
  222. }
  223.  
  224. /// <summary>
  225. /// 当前房间所有敌人都被清除了
  226. /// </summary>
  227. public void OnClearRoom()
  228. {
  229. if (RoomPreinstall.IsLastWave) //所有 mark 都走完了
  230. {
  231. IsSeclusion = false;
  232. //开门
  233. if (RoomPreinstall.HasEnemy())
  234. {
  235. foreach (var doorInfo in Doors)
  236. {
  237. doorInfo.Door.OpenDoor();
  238. }
  239. }
  240. //所有标记执行完成
  241. RoomPreinstall.OverWave();
  242. }
  243. else //执行下一波
  244. {
  245. RoomPreinstall.NextWave();
  246. }
  247. }
  248. }