Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / room / RoomDoorInfo.cs
@小李xl 小李xl on 30 Nov 2023 7 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 NavigationPolygonData AisleNavigation;
  61.  
  62. /// <summary>
  63. /// 门实例
  64. /// </summary>
  65. public RoomDoor Door;
  66.  
  67. /// <summary>
  68. /// 过道的迷雾
  69. /// </summary>
  70. public FogMask AisleFogMask;
  71.  
  72. /// <summary>
  73. /// 过道迷雾区域
  74. /// </summary>
  75. public AisleFogArea AisleFogArea;
  76.  
  77. /// <summary>
  78. /// 门区域预览房间迷雾
  79. /// </summary>
  80. public PreviewFogMask PreviewRoomFogMask;
  81. /// <summary>
  82. /// 门区域预览过道迷雾
  83. /// </summary>
  84. public PreviewFogMask PreviewAisleFogMask;
  85.  
  86. /// <summary>
  87. /// 世界坐标下的原点坐标, 单位: 像素
  88. /// </summary>
  89. public Vector2I GetWorldOriginPosition()
  90. {
  91. return new Vector2I(
  92. OriginPosition.X * GameConfig.TileCellSize,
  93. OriginPosition.Y * GameConfig.TileCellSize
  94. );
  95. }
  96.  
  97. /// <summary>
  98. /// 世界坐标下的终点坐标, 单位: 像素
  99. /// </summary>
  100. public Vector2I GetWorldEndPosition()
  101. {
  102. if (Direction == DoorDirection.E || Direction == DoorDirection.W)
  103. {
  104. return GetWorldOriginPosition() + new Vector2I(0, 4 * GameConfig.TileCellSize);
  105. }
  106. else if (Direction == DoorDirection.N || Direction == DoorDirection.S)
  107. {
  108. return GetWorldOriginPosition() + new Vector2I(4 * GameConfig.TileCellSize, 0);
  109. }
  110.  
  111. return default;
  112. }
  113.  
  114. /// <summary>
  115. /// 获取直连门过道区域数据, 单位: 格, 如果当前门连接区域带交叉点, 则报错
  116. /// </summary>
  117. public Rect2I GetAisleRect()
  118. {
  119. if (HasCross)
  120. {
  121. throw new Exception("当前门连接的过道包含交叉点, 请改用 GetCrossAisleRect() 函数!");
  122. }
  123. var rect = Utils.CalcRect(
  124. OriginPosition.X,
  125. OriginPosition.Y,
  126. ConnectDoor.OriginPosition.X,
  127. ConnectDoor.OriginPosition.Y
  128. );
  129. switch (Direction)
  130. {
  131. case DoorDirection.E:
  132. rect.Size = new Vector2I(rect.Size.X, GameConfig.CorridorWidth);
  133. break;
  134. case DoorDirection.W:
  135. rect.Size = new Vector2I(rect.Size.X, GameConfig.CorridorWidth);
  136. break;
  137. case DoorDirection.S:
  138. rect.Size = new Vector2I(GameConfig.CorridorWidth, rect.Size.Y);
  139. break;
  140. case DoorDirection.N:
  141. rect.Size = new Vector2I(GameConfig.CorridorWidth, rect.Size.Y);
  142. break;
  143. }
  144.  
  145. return rect;
  146. }
  147.  
  148. /// <summary>
  149. /// 获取交叉门过道区域数据, 单位: 格, 如果当前门连接区域不带交叉点, 则报错
  150. /// </summary>
  151. public CrossAisleRectData GetCrossAisleRect()
  152. {
  153. if (!HasCross)
  154. {
  155. throw new Exception("当前门连接的过道不包含交叉点, 请改用 GetAisleRect() 函数!");
  156. }
  157.  
  158. Rect2I rect;
  159. Rect2I rect2;
  160.  
  161. //计算范围
  162. switch (Direction)
  163. {
  164. case DoorDirection.E: //→
  165. rect = new Rect2I(
  166. OriginPosition.X,
  167. OriginPosition.Y,
  168. Cross.X - OriginPosition.X,
  169. GameConfig.CorridorWidth
  170. );
  171. break;
  172. case DoorDirection.W: //←
  173. rect = new Rect2I(
  174. Cross.X + GameConfig.CorridorWidth,
  175. Cross.Y,
  176. OriginPosition.X - (Cross.X + GameConfig.CorridorWidth),
  177. GameConfig.CorridorWidth
  178. );
  179. break;
  180. case DoorDirection.S: //↓
  181. rect = new Rect2I(
  182. OriginPosition.X,
  183. OriginPosition.Y,
  184. GameConfig.CorridorWidth,
  185. Cross.Y - OriginPosition.Y
  186. );
  187. break;
  188. case DoorDirection.N: //↑
  189. rect = new Rect2I(
  190. Cross.X,
  191. Cross.Y + GameConfig.CorridorWidth,
  192. GameConfig.CorridorWidth,
  193. OriginPosition.Y - (Cross.Y + GameConfig.CorridorWidth)
  194. );
  195. break;
  196. default:
  197. rect = new Rect2I();
  198. break;
  199. }
  200.  
  201. switch (ConnectDoor.Direction)
  202. {
  203. case DoorDirection.E: //→
  204. rect2 = new Rect2I(
  205. ConnectDoor.OriginPosition.X,
  206. ConnectDoor.OriginPosition.Y,
  207. Cross.X - ConnectDoor.OriginPosition.X,
  208. GameConfig.CorridorWidth
  209. );
  210. break;
  211. case DoorDirection.W: //←
  212. rect2 = new Rect2I(
  213. Cross.X + GameConfig.CorridorWidth,
  214. Cross.Y,
  215. ConnectDoor.OriginPosition.X -
  216. (Cross.X + GameConfig.CorridorWidth),
  217. GameConfig.CorridorWidth
  218. );
  219. break;
  220. case DoorDirection.S: //↓
  221. rect2 = new Rect2I(
  222. ConnectDoor.OriginPosition.X,
  223. ConnectDoor.OriginPosition.Y,
  224. GameConfig.CorridorWidth,
  225. Cross.Y - ConnectDoor.OriginPosition.Y
  226. );
  227. break;
  228. case DoorDirection.N: //↑
  229. rect2 = new Rect2I(
  230. Cross.X,
  231. Cross.Y + GameConfig.CorridorWidth,
  232. GameConfig.CorridorWidth,
  233. ConnectDoor.OriginPosition.Y -
  234. (Cross.Y + GameConfig.CorridorWidth)
  235. );
  236. break;
  237. default:
  238. rect2 = new Rect2I();
  239. break;
  240. }
  241.  
  242. return new CrossAisleRectData()
  243. {
  244. Rect1 = rect,
  245. Rect2 = rect2,
  246. Cross = new Rect2I(Cross + Vector2I.One, new Vector2I(GameConfig.CorridorWidth - 2, GameConfig.CorridorWidth - 2))
  247. };
  248. }
  249. public void Destroy()
  250. {
  251. if (IsDestroyed)
  252. {
  253. return;
  254. }
  255.  
  256. IsDestroyed = true;
  257. if (AisleFogMask != null)
  258. {
  259. AisleFogMask.Destroy();
  260. }
  261.  
  262. if (AisleFogArea != null)
  263. {
  264. AisleFogArea.Destroy();
  265. }
  266.  
  267. if (PreviewRoomFogMask != null)
  268. {
  269. PreviewRoomFogMask.Destroy();
  270. }
  271. if (PreviewAisleFogMask != null)
  272. {
  273. PreviewAisleFogMask.Destroy();
  274. }
  275. }
  276. }