Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / fog / FogMaskHandler.cs
  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 != null)
  93. {
  94. if (!fogMask.IsExplored) //未探索该区域
  95. {
  96. fogMask.IsExplored = true;
  97. fogMask.TransitionAlpha(0, 1);
  98. //小地图亮起该房间
  99. roomInfo.PreviewSprite.Visible = true;
  100.  
  101. //刷新预览区域
  102. foreach (var roomInfoDoor in roomInfo.Doors)
  103. {
  104. if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑
  105. {
  106. _RefreshAisleFog(roomInfoDoor);
  107. }
  108. else //未探索
  109. {
  110. //显示预览过道
  111. roomInfoDoor.PreviewRoomFogMask.SetActive(false);
  112. roomInfoDoor.PreviewAisleFogMask.SetActive(true);
  113. roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(0, 1);
  114. }
  115. }
  116. }
  117. else //已经探索过
  118. {
  119. //变亮
  120. fogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 1);
  121. foreach (var roomInfoDoor in roomInfo.Doors)
  122. {
  123. if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑
  124. {
  125. _RefreshAisleFog(roomInfoDoor);
  126. }
  127. else //未探索
  128. {
  129. //显示预览过道
  130. roomInfoDoor.PreviewRoomFogMask.SetActive(false);
  131. roomInfoDoor.PreviewAisleFogMask.SetActive(true);
  132. roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1);
  133. }
  134. }
  135. }
  136. }
  137. }
  138.  
  139. private static void _RefreshAisleFog(RoomDoorInfo doorInfo)
  140. {
  141. //Debug.Log("RefreshAisleFog: " + doorInfo.RoomInfo.Id + doorInfo.Direction);
  142. var fogMask = doorInfo.AisleFogMask;
  143.  
  144. var connectDoor = doorInfo.ConnectDoor;
  145. if (!fogMask.IsExplored) //未探索该区域
  146. {
  147. //小地图亮起该过道
  148. doorInfo.AislePreviewSprite.Visible = true;
  149. fogMask.IsExplored = true;
  150. doorInfo.PreviewAisleFogMask.IsExplored = true;
  151. doorInfo.PreviewRoomFogMask.IsExplored = true;
  152. doorInfo.ConnectDoor.PreviewAisleFogMask.IsExplored = true;
  153. doorInfo.ConnectDoor.PreviewRoomFogMask.IsExplored = true;
  154. fogMask.TransitionAlpha(1);
  155. //隐藏预览
  156. if (doorInfo.PreviewAisleFogMask.Visible)
  157. {
  158. doorInfo.PreviewAisleFogMask.TransitionToHide();
  159. }
  160. //显示下一个房间预览
  161. if (!connectDoor.RoomInfo.RoomFogMask.IsExplored)
  162. {
  163. connectDoor.PreviewRoomFogMask.SetActive(true);
  164. connectDoor.PreviewRoomFogMask.TransitionAlpha(0, 1);
  165. }
  166. }
  167. else //已经探索过
  168. {
  169. if (doorInfo.Door.IsClose) //房间已经关门
  170. {
  171. //过道迷雾变暗
  172. fogMask.TransitionToDark();
  173. //隐藏房间预览
  174. if (doorInfo.PreviewRoomFogMask.Visible)
  175. {
  176. doorInfo.PreviewRoomFogMask.TransitionToHide();
  177. }
  178. //显示过道预览
  179. if (!doorInfo.PreviewAisleFogMask.Visible)
  180. {
  181. doorInfo.PreviewAisleFogMask.SetActive(true);
  182. doorInfo.PreviewAisleFogMask.TransitionAlpha(0, 1 - doorInfo.AisleFogMask.TargetAlpha);
  183. }
  184. }
  185. else
  186. {
  187. //过道迷雾变亮
  188. fogMask.TransitionToLight();
  189. //隐藏房间预览
  190. if (doorInfo.PreviewRoomFogMask.Visible)
  191. {
  192. doorInfo.PreviewRoomFogMask.TransitionToHide();
  193. }
  194. //隐藏过道预览
  195. if (doorInfo.PreviewAisleFogMask.Visible)
  196. {
  197. doorInfo.PreviewAisleFogMask.TransitionToHide();
  198. }
  199. //连接的房间显示房间预览
  200. if (!connectDoor.PreviewRoomFogMask.Visible)
  201. {
  202. connectDoor.PreviewRoomFogMask.SetActive(true);
  203. }
  204.  
  205. var tempA = 1 - connectDoor.RoomInfo.RoomFogMask.TargetAlpha;
  206. if (Math.Abs(connectDoor.PreviewRoomFogMask.TargetAlpha - tempA) > 0.001f)
  207. {
  208. if (connectDoor.RoomInfo.RoomFogMask.IsExplored)
  209. {
  210. connectDoor.PreviewRoomFogMask.TransitionAlpha(0, tempA);
  211. }
  212. else
  213. {
  214. connectDoor.PreviewRoomFogMask.TransitionAlpha(tempA);
  215. }
  216. }
  217.  
  218. //连接的房间隐藏过道预览
  219. if (connectDoor.PreviewAisleFogMask.Visible)
  220. {
  221. connectDoor.PreviewAisleFogMask.TransitionToHide();
  222. }
  223. }
  224. }
  225. }
  226.  
  227. public static void ClearRecordRoom()
  228. {
  229. _prevRoomInfo = null;
  230. _tempDoorInfo = null;
  231. _tempRoomInfo = null;
  232. }
  233. }