Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / fog / FogMaskHandler.cs
@小李xl 小李xl on 4 Dec 2023 8 KB 制作敌人2子弹
  1.  
  2. using System;
  3. using Godot;
  4.  
  5. public static class FogMaskHandler
  6. {
  7. private static RoomInfo _prevRoomInfo;
  8. private static RoomInfo _tempRoomInfo;
  9. private static RoomDoorInfo _tempDoorInfo;
  10.  
  11. public static void RefreshRoomFog(RoomInfo roomInfo)
  12. {
  13. _tempRoomInfo = roomInfo;
  14. }
  15.  
  16. public static void RefreshAisleFog(RoomDoorInfo doorInfo)
  17. {
  18. if (_prevRoomInfo != null)
  19. {
  20. if (doorInfo.RoomInfo == _prevRoomInfo)
  21. {
  22. _tempDoorInfo = doorInfo;
  23. }
  24. else if (doorInfo.ConnectDoor.RoomInfo == _prevRoomInfo)
  25. {
  26. _tempDoorInfo = doorInfo.ConnectDoor;
  27. }
  28. return;
  29. }
  30. _tempDoorInfo = doorInfo;
  31. }
  32.  
  33. public static void Update()
  34. {
  35. if (_tempRoomInfo != null)
  36. {
  37. //刷新房间会附带刷新过道
  38. _RefreshRoomFog(_tempRoomInfo);
  39. }
  40. else if (_tempDoorInfo != null)
  41. {
  42. //刷新过道
  43. _RefreshAisleFog(_tempDoorInfo);
  44. }
  45.  
  46. _tempRoomInfo = null;
  47. _tempDoorInfo = null;
  48. }
  49. private static void _RefreshRoomFog(RoomInfo roomInfo)
  50. {
  51. if (_prevRoomInfo != roomInfo)
  52. {
  53. //Debug.Log($"切换房间: {_prevRoomInfo?.Id} => {roomInfo.Id}");
  54. if (_prevRoomInfo != null)
  55. {
  56. //房间变暗
  57. _prevRoomInfo.RoomFogMask.TransitionAlpha(GameConfig.DarkFogAlpha);
  58. //刷新预览区域
  59. foreach (var roomInfoDoor in _prevRoomInfo.Doors)
  60. {
  61. //不是连接到当前房间的, 过道通通变暗
  62. if (roomInfoDoor.ConnectDoor.RoomInfo != roomInfo)
  63. {
  64. var prevAisleFog = roomInfoDoor.AisleFogMask;
  65. if (!prevAisleFog.IsExplored)
  66. {
  67. roomInfoDoor.PreviewAisleFogMask.TransitionToDark();
  68. }
  69. else
  70. {
  71. prevAisleFog.TransitionToDark();
  72. if (roomInfoDoor.ConnectDoor.PreviewRoomFogMask.Visible)
  73. {
  74. if (roomInfoDoor.ConnectDoor.RoomInfo.RoomFogMask.IsExplored)
  75. {
  76. roomInfoDoor.ConnectDoor.PreviewRoomFogMask.TransitionToHide();
  77. }
  78. else
  79. {
  80. roomInfoDoor.ConnectDoor.PreviewRoomFogMask.TransitionToDark();
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87.  
  88. _prevRoomInfo = roomInfo;
  89. }
  90. //Debug.Log("RefreshRoomFog: " + roomInfo.Id);
  91. var fogMask = roomInfo.RoomFogMask;
  92. if (!fogMask.IsExplored) //未探索该区域
  93. {
  94. fogMask.IsExplored = true;
  95. fogMask.TransitionAlpha(0, 1);
  96. //小地图亮起该房间
  97. roomInfo.PreviewSprite.Visible = true;
  98.  
  99. //刷新预览区域
  100. foreach (var roomInfoDoor in roomInfo.Doors)
  101. {
  102. if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑
  103. {
  104. _RefreshAisleFog(roomInfoDoor);
  105. }
  106. else //未探索
  107. {
  108. //显示预览过道
  109. roomInfoDoor.PreviewRoomFogMask.SetActive(false);
  110. roomInfoDoor.PreviewAisleFogMask.SetActive(true);
  111. roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(0, 1);
  112. }
  113. }
  114. }
  115. else //已经探索过
  116. {
  117. //变亮
  118. fogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 1);
  119. foreach (var roomInfoDoor in roomInfo.Doors)
  120. {
  121. if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑
  122. {
  123. _RefreshAisleFog(roomInfoDoor);
  124. }
  125. else //未探索
  126. {
  127. //显示预览过道
  128. roomInfoDoor.PreviewRoomFogMask.SetActive(false);
  129. roomInfoDoor.PreviewAisleFogMask.SetActive(true);
  130. roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1);
  131. }
  132. }
  133. }
  134. }
  135.  
  136. private static void _RefreshAisleFog(RoomDoorInfo doorInfo)
  137. {
  138. //Debug.Log("RefreshAisleFog: " + doorInfo.RoomInfo.Id + doorInfo.Direction);
  139. var fogMask = doorInfo.AisleFogMask;
  140.  
  141. var connectDoor = doorInfo.ConnectDoor;
  142. if (!fogMask.IsExplored) //未探索该区域
  143. {
  144. //小地图亮起该过道
  145. doorInfo.AislePreviewSprite.Visible = true;
  146. fogMask.IsExplored = true;
  147. doorInfo.PreviewAisleFogMask.IsExplored = true;
  148. doorInfo.PreviewRoomFogMask.IsExplored = true;
  149. doorInfo.ConnectDoor.PreviewAisleFogMask.IsExplored = true;
  150. doorInfo.ConnectDoor.PreviewRoomFogMask.IsExplored = true;
  151. fogMask.TransitionAlpha(1);
  152. //隐藏预览
  153. if (doorInfo.PreviewAisleFogMask.Visible)
  154. {
  155. doorInfo.PreviewAisleFogMask.TransitionToHide();
  156. }
  157. //显示下一个房间预览
  158. if (!connectDoor.RoomInfo.RoomFogMask.IsExplored)
  159. {
  160. connectDoor.PreviewRoomFogMask.SetActive(true);
  161. connectDoor.PreviewRoomFogMask.TransitionAlpha(0, 1);
  162. }
  163. }
  164. else //已经探索过
  165. {
  166. if (doorInfo.Door.IsClose) //房间已经关门
  167. {
  168. //过道迷雾变暗
  169. fogMask.TransitionToDark();
  170. //隐藏房间预览
  171. if (doorInfo.PreviewRoomFogMask.Visible)
  172. {
  173. doorInfo.PreviewRoomFogMask.TransitionToHide();
  174. }
  175. //显示过道预览
  176. if (!doorInfo.PreviewAisleFogMask.Visible)
  177. {
  178. doorInfo.PreviewAisleFogMask.SetActive(true);
  179. doorInfo.PreviewAisleFogMask.TransitionAlpha(0, 1 - doorInfo.AisleFogMask.TargetAlpha);
  180. }
  181. }
  182. else
  183. {
  184. //过道迷雾变亮
  185. fogMask.TransitionToLight();
  186. //隐藏房间预览
  187. if (doorInfo.PreviewRoomFogMask.Visible)
  188. {
  189. doorInfo.PreviewRoomFogMask.TransitionToHide();
  190. }
  191. //隐藏过道预览
  192. if (doorInfo.PreviewAisleFogMask.Visible)
  193. {
  194. doorInfo.PreviewAisleFogMask.TransitionToHide();
  195. }
  196. //连接的房间显示房间预览
  197. if (!connectDoor.PreviewRoomFogMask.Visible)
  198. {
  199. connectDoor.PreviewRoomFogMask.SetActive(true);
  200. }
  201.  
  202. var tempA = 1 - connectDoor.RoomInfo.RoomFogMask.TargetAlpha;
  203. if (Math.Abs(connectDoor.PreviewRoomFogMask.TargetAlpha - tempA) > 0.001f)
  204. {
  205. if (connectDoor.RoomInfo.RoomFogMask.IsExplored)
  206. {
  207. connectDoor.PreviewRoomFogMask.TransitionAlpha(0, tempA);
  208. }
  209. else
  210. {
  211. connectDoor.PreviewRoomFogMask.TransitionAlpha(tempA);
  212. }
  213. }
  214.  
  215. //连接的房间隐藏过道预览
  216. if (connectDoor.PreviewAisleFogMask.Visible)
  217. {
  218. connectDoor.PreviewAisleFogMask.TransitionToHide();
  219. }
  220. }
  221. }
  222. }
  223.  
  224. public static void ClearRecordRoom()
  225. {
  226. _prevRoomInfo = null;
  227. _tempDoorInfo = null;
  228. _tempRoomInfo = null;
  229. }
  230. }