Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / room / RoomDoorInfo.cs
@小李xl 小李xl on 11 Oct 2023 6 KB 过道迷雾过渡, 开发完成
  1.  
  2. using System;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 房间的门
  7. /// </summary>
  8. public class RoomDoorInfo : IDestroy
  9. {
  10. public bool IsDestroyed { get; private set; }
  11.  
  12. /// <summary>
  13. /// 所在墙面方向
  14. /// </summary>
  15. public DoorDirection Direction;
  16.  
  17. /// <summary>
  18. /// 是否是正向的门
  19. /// </summary>
  20. public bool IsForward;
  21.  
  22. /// <summary>
  23. /// 所在的房间
  24. /// </summary>
  25. public RoomInfo RoomInfo;
  26.  
  27. /// <summary>
  28. /// 连接的门
  29. /// </summary>
  30. public RoomDoorInfo ConnectDoor;
  31.  
  32. /// <summary>
  33. /// 连接的房间
  34. /// </summary>
  35. public RoomInfo ConnectRoom;
  36.  
  37. /// <summary>
  38. /// 原点坐标, 单位: 格
  39. /// </summary>
  40. public Vector2I OriginPosition;
  41.  
  42. /// <summary>
  43. /// 与下一道门是否有交叉点
  44. /// </summary>
  45. public bool HasCross;
  46.  
  47. /// <summary>
  48. /// 与下一道门的交叉点, 单位: 格
  49. /// </summary>
  50. public Vector2I Cross;
  51.  
  52. /// <summary>
  53. /// 占位导航网格
  54. /// </summary>
  55. public DoorNavigationInfo Navigation;
  56.  
  57. /// <summary>
  58. /// 门实例
  59. /// </summary>
  60. public RoomDoor Door;
  61.  
  62. /// <summary>
  63. /// 过道的迷雾
  64. /// </summary>
  65. public FogMask AisleFogMask;
  66.  
  67. /// <summary>
  68. /// 过道迷雾区域
  69. /// </summary>
  70. public AisleFogArea AisleFogArea;
  71.  
  72. /// <summary>
  73. /// 门区域预览房间迷雾
  74. /// </summary>
  75. public PreviewFogMask PreviewRoomFogMask;
  76. /// <summary>
  77. /// 门区域预览过道迷雾
  78. /// </summary>
  79. public PreviewFogMask PreviewAisleFogMask;
  80.  
  81. /// <summary>
  82. /// 世界坐标下的原点坐标, 单位: 像素
  83. /// </summary>
  84. public Vector2I GetWorldOriginPosition()
  85. {
  86. return new Vector2I(
  87. OriginPosition.X * GameConfig.TileCellSize,
  88. OriginPosition.Y * GameConfig.TileCellSize
  89. );
  90. }
  91.  
  92. /// <summary>
  93. /// 获取直连门过道区域数据, 单位: 格, 如果当前门连接区域带交叉点, 则报错
  94. /// </summary>
  95. public Rect2I GetAisleRect()
  96. {
  97. if (HasCross)
  98. {
  99. throw new Exception("当前门连接的过道包含交叉点, 请改用 GetCrossAisleRect() 函数!");
  100. }
  101. var rect = Utils.CalcRect(
  102. OriginPosition.X,
  103. OriginPosition.Y,
  104. ConnectDoor.OriginPosition.X,
  105. ConnectDoor.OriginPosition.Y
  106. );
  107. switch (Direction)
  108. {
  109. case DoorDirection.E:
  110. rect.Size = new Vector2I(rect.Size.X, GameConfig.CorridorWidth);
  111. break;
  112. case DoorDirection.W:
  113. rect.Size = new Vector2I(rect.Size.X, GameConfig.CorridorWidth);
  114. break;
  115. case DoorDirection.S:
  116. rect.Size = new Vector2I(GameConfig.CorridorWidth, rect.Size.Y);
  117. break;
  118. case DoorDirection.N:
  119. rect.Size = new Vector2I(GameConfig.CorridorWidth, rect.Size.Y);
  120. break;
  121. }
  122.  
  123. return rect;
  124. }
  125.  
  126. /// <summary>
  127. /// 获取交叉门过道区域数据, 单位: 格, 如果当前门连接区域不带交叉点, 则报错
  128. /// </summary>
  129. public CrossAisleRectData GetCrossAisleRect()
  130. {
  131. if (!HasCross)
  132. {
  133. throw new Exception("当前门连接的过道不包含交叉点, 请改用 GetAisleRect() 函数!");
  134. }
  135.  
  136. Rect2I rect;
  137. Rect2I rect2;
  138.  
  139. //计算范围
  140. switch (Direction)
  141. {
  142. case DoorDirection.E: //→
  143. rect = new Rect2I(
  144. OriginPosition.X,
  145. OriginPosition.Y,
  146. Cross.X - OriginPosition.X,
  147. GameConfig.CorridorWidth
  148. );
  149. break;
  150. case DoorDirection.W: //←
  151. rect = new Rect2I(
  152. Cross.X + GameConfig.CorridorWidth,
  153. Cross.Y,
  154. OriginPosition.X - (Cross.X + GameConfig.CorridorWidth),
  155. GameConfig.CorridorWidth
  156. );
  157. break;
  158. case DoorDirection.S: //↓
  159. rect = new Rect2I(
  160. OriginPosition.X,
  161. OriginPosition.Y,
  162. GameConfig.CorridorWidth,
  163. Cross.Y - OriginPosition.Y
  164. );
  165. break;
  166. case DoorDirection.N: //↑
  167. rect = new Rect2I(
  168. Cross.X,
  169. Cross.Y + GameConfig.CorridorWidth,
  170. GameConfig.CorridorWidth,
  171. OriginPosition.Y - (Cross.Y + GameConfig.CorridorWidth)
  172. );
  173. break;
  174. default:
  175. rect = new Rect2I();
  176. break;
  177. }
  178.  
  179. switch (ConnectDoor.Direction)
  180. {
  181. case DoorDirection.E: //→
  182. rect2 = new Rect2I(
  183. ConnectDoor.OriginPosition.X,
  184. ConnectDoor.OriginPosition.Y,
  185. Cross.X - ConnectDoor.OriginPosition.X,
  186. GameConfig.CorridorWidth
  187. );
  188. break;
  189. case DoorDirection.W: //←
  190. rect2 = new Rect2I(
  191. Cross.X + GameConfig.CorridorWidth,
  192. Cross.Y,
  193. ConnectDoor.OriginPosition.X -
  194. (Cross.X + GameConfig.CorridorWidth),
  195. GameConfig.CorridorWidth
  196. );
  197. break;
  198. case DoorDirection.S: //↓
  199. rect2 = new Rect2I(
  200. ConnectDoor.OriginPosition.X,
  201. ConnectDoor.OriginPosition.Y,
  202. GameConfig.CorridorWidth,
  203. Cross.Y - ConnectDoor.OriginPosition.Y
  204. );
  205. break;
  206. case DoorDirection.N: //↑
  207. rect2 = new Rect2I(
  208. Cross.X,
  209. Cross.Y + GameConfig.CorridorWidth,
  210. GameConfig.CorridorWidth,
  211. ConnectDoor.OriginPosition.Y -
  212. (Cross.Y + GameConfig.CorridorWidth)
  213. );
  214. break;
  215. default:
  216. rect2 = new Rect2I();
  217. break;
  218. }
  219.  
  220. return new CrossAisleRectData()
  221. {
  222. Rect1 = rect,
  223. Rect2 = rect2,
  224. Cross = new Rect2I(Cross + Vector2I.One, new Vector2I(GameConfig.CorridorWidth - 2, GameConfig.CorridorWidth - 2))
  225. };
  226. }
  227. public void Destroy()
  228. {
  229. if (IsDestroyed)
  230. {
  231. return;
  232. }
  233.  
  234. IsDestroyed = true;
  235. if (AisleFogMask != null)
  236. {
  237. AisleFogMask.Destroy();
  238. }
  239.  
  240. if (AisleFogArea != null)
  241. {
  242. AisleFogArea.Destroy();
  243. }
  244.  
  245. if (PreviewRoomFogMask != null)
  246. {
  247. PreviewRoomFogMask.Destroy();
  248. }
  249. if (PreviewAisleFogMask != null)
  250. {
  251. PreviewAisleFogMask.Destroy();
  252. }
  253. }
  254. }