Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / room / RoomInfo.cs
@小李xl 小李xl on 6 Oct 2023 10 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<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 FogMask FogMask;
  82. /// <summary>
  83. /// 房间算上连接通道所占用的区域
  84. /// </summary>
  85. public Rect2I OuterRange { get; private set; }
  86.  
  87. /// <summary>
  88. /// 是否处于闭关状态, 也就是房间门没有主动打开
  89. /// </summary>
  90. public bool IsSeclusion { get; private set; } = false;
  91. public bool IsDestroyed { get; private set; }
  92. private bool _openDoorFlag = true;
  93. // private bool _beReady = false;
  94. // private bool _waveStart = false;
  95. // private int _currWaveIndex = 0;
  96. // private int _currWaveNumber = 0;
  97. //private List<ActivityMark> _currActivityMarks = new List<ActivityMark>();
  98.  
  99. /// <summary>
  100. /// 重新计算占用的区域
  101. /// </summary>
  102. public void CalcOuterRange()
  103. {
  104. var worldPos = GetWorldPosition();
  105. var pos = new Vector2I(worldPos.X, worldPos.Y);
  106. var minX = pos.X;
  107. var minY = pos.Y;
  108. var maxX = minX + GetWidth();
  109. var maxY = minY + GetHeight();
  110.  
  111. //遍历每一个连接的门, 计算计算canvas覆盖范围
  112. foreach (var doorInfo in Doors)
  113. {
  114. var connectDoor = doorInfo.ConnectDoor;
  115. switch (connectDoor.Direction)
  116. {
  117. case DoorDirection.E:
  118. case DoorDirection.W:
  119. {
  120. var (px1, py1) = connectDoor.GetWorldOriginPosition();
  121. var py2 = py1 + 4 * GameConfig.TileCellSize;
  122. if (px1 < minX)
  123. {
  124. minX = px1;
  125. }
  126. else if (px1 > maxX)
  127. {
  128. maxX = px1;
  129. }
  130.  
  131. if (py1 < minY)
  132. {
  133. minY = py1;
  134. }
  135. else if (py1 > maxY)
  136. {
  137. maxY = py1;
  138. }
  139. if (py2 < minY)
  140. {
  141. minY = py2;
  142. }
  143. else if (py2 > maxY)
  144. {
  145. maxY = py2;
  146. }
  147. }
  148. break;
  149. case DoorDirection.S:
  150. case DoorDirection.N:
  151. {
  152. var (px1, py1) = connectDoor.GetWorldOriginPosition();
  153. var px2 = px1 + 4 * GameConfig.TileCellSize;
  154. if (px1 < minX)
  155. {
  156. minX = px1;
  157. }
  158. else if (px1 > maxX)
  159. {
  160. maxX = px1;
  161. }
  162.  
  163. if (py1 < minY)
  164. {
  165. minY = py1;
  166. }
  167. else if (py1 > maxY)
  168. {
  169. maxY = py1;
  170. }
  171. if (px2 < minX)
  172. {
  173. minX = px2;
  174. }
  175. else if (px2 > maxX)
  176. {
  177. maxX = px2;
  178. }
  179. }
  180. break;
  181. }
  182. }
  183.  
  184. OuterRange = new Rect2I(minX, minY, maxX - minX, maxY - minY);
  185. }
  186. /// <summary>
  187. /// 获取房间的全局坐标, 单位: 像素
  188. /// </summary>
  189. public Vector2I GetWorldPosition()
  190. {
  191. return new Vector2I(
  192. Position.X * GameConfig.TileCellSize,
  193. Position.Y * GameConfig.TileCellSize
  194. );
  195. }
  196.  
  197. /// <summary>
  198. /// 获取房间左上角的 Tile 距离全局坐标原点的偏移, 单位: 像素
  199. /// </summary>
  200. /// <returns></returns>
  201. public Vector2I GetOffsetPosition()
  202. {
  203. return RoomSplit.RoomInfo.Position.AsVector2I() * GameConfig.TileCellSize;
  204. }
  205. /// <summary>
  206. /// 获取房间横轴结束位置, 单位: 格
  207. /// </summary>
  208. public int GetHorizontalEnd()
  209. {
  210. return Position.X + Size.X;
  211. }
  212.  
  213. /// <summary>
  214. /// 获取房间纵轴结束位置, 单位: 格
  215. /// </summary>
  216. public int GetVerticalEnd()
  217. {
  218. return Position.Y + Size.Y;
  219. }
  220. /// <summary>
  221. /// 获取房间横轴开始位置, 单位: 格
  222. /// </summary>
  223. public int GetHorizontalStart()
  224. {
  225. return Position.X;
  226. }
  227.  
  228. /// <summary>
  229. /// 获取房间纵轴开始位置, 单位: 格
  230. /// </summary>
  231. public int GetVerticalStart()
  232. {
  233. return Position.Y;
  234. }
  235.  
  236. /// <summary>
  237. /// 获取房间宽度, 单位: 像素
  238. /// </summary>
  239. public int GetWidth()
  240. {
  241. return Size.X * GameConfig.TileCellSize;
  242. }
  243. /// <summary>
  244. /// 获取房间高度, 单位: 像素
  245. /// </summary>
  246. public int GetHeight()
  247. {
  248. return Size.Y * GameConfig.TileCellSize;
  249. }
  250. public void Destroy()
  251. {
  252. if (IsDestroyed)
  253. {
  254. return;
  255. }
  256.  
  257. IsDestroyed = true;
  258. foreach (var nextRoom in Next)
  259. {
  260. nextRoom.Destroy();
  261. }
  262. Next.Clear();
  263. if (RoomPreinstall != null)
  264. {
  265. RoomPreinstall.Destroy();
  266. RoomPreinstall = null;
  267. }
  268. if (StaticImageCanvas != null)
  269. {
  270. StaticImageCanvas.Destroy();
  271. }
  272.  
  273. if (FogMask != null)
  274. {
  275. FogMask.Destroy();
  276. }
  277.  
  278. if (AffiliationArea != null)
  279. {
  280. AffiliationArea.Destroy();
  281. }
  282. }
  283. /// <summary>
  284. /// 加载地牢完成
  285. /// </summary>
  286. public void OnReady()
  287. {
  288. //提前加载波
  289. RoomPreinstall.OnReady();
  290. }
  291. /// <summary>
  292. /// 玩家第一次进入房间, 房间准备好了, 准备刷敌人, 并且关闭所有<br/>
  293. /// 当清完每一波刷新的敌人后即可开门
  294. /// </summary>
  295. public void OnFirstEnter()
  296. {
  297. if (RoomPreinstall.IsRunWave)
  298. {
  299. return;
  300. }
  301. //房间内有敌人, 或者会刷新敌人才会关门
  302. var hasEnemy = false;
  303. if (AffiliationArea.ExistEnterItem(activityObject => activityObject.CollisionWithMask(PhysicsLayer.Enemy))) //先判断房间里面是否有敌人
  304. {
  305. hasEnemy = true;
  306. }
  307. else if (RoomPreinstall.HasEnemy()) //在判断是否会刷出敌人
  308. {
  309. hasEnemy = true;
  310. }
  311.  
  312. if (!hasEnemy) //没有敌人, 不关门
  313. {
  314. IsSeclusion = false;
  315. //执行第一波生成
  316. RoomPreinstall.StartWave();
  317. return;
  318. }
  319.  
  320. //关门
  321. CloseDoor();
  322. IsSeclusion = true;
  323.  
  324. //执行第一波生成
  325. RoomPreinstall.StartWave();
  326. }
  327.  
  328. /// <summary>
  329. /// 当前房间所有敌人都被清除了
  330. /// </summary>
  331. public void OnClearRoom()
  332. {
  333. if (RoomPreinstall.IsLastWave) //所有 mark 都走完了
  334. {
  335. IsSeclusion = false;
  336. if (RoomPreinstall.HasEnemy())
  337. {
  338. //开门
  339. OpenDoor();
  340. }
  341. //所有标记执行完成
  342. RoomPreinstall.OverWave();
  343. }
  344. else //执行下一波
  345. {
  346. RoomPreinstall.NextWave();
  347. }
  348. }
  349.  
  350. /// <summary>
  351. /// 打开所有门
  352. /// </summary>
  353. public void OpenDoor()
  354. {
  355. if (!_openDoorFlag)
  356. {
  357. _openDoorFlag = true;
  358. AffiliationArea.RestoreRegion();
  359. }
  360. foreach (var doorInfo in Doors)
  361. {
  362. doorInfo.Door.OpenDoor();
  363. }
  364. }
  365.  
  366. /// <summary>
  367. /// 关闭所有门
  368. /// </summary>
  369. public void CloseDoor()
  370. {
  371. if (_openDoorFlag)
  372. {
  373. _openDoorFlag = false;
  374. AffiliationArea.ExtendedRegion(new Vector2(GameConfig.TileCellSize * 4, GameConfig.TileCellSize * 4));
  375. }
  376.  
  377. foreach (var doorInfo in Doors)
  378. {
  379. doorInfo.Door.CloseDoor();
  380. }
  381. }
  382.  
  383. /// <summary>
  384. /// 获取该房间所有正向的门,nextRoom.id > this.id
  385. /// </summary>
  386. public RoomDoorInfo[] GetForwardDoors()
  387. {
  388. var temp = new List<RoomDoorInfo>();
  389. foreach (var doorInfo in Doors)
  390. {
  391. if (doorInfo.ConnectRoom.Id > Id)
  392. {
  393. temp.Add(doorInfo);
  394. }
  395. }
  396.  
  397. return temp.ToArray();
  398. }
  399. }