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