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