diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs index e056bbf..1972ec2 100644 --- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs +++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs @@ -256,9 +256,9 @@ if (IsFirstEnterFlag) { EventManager.EmitEvent(EventEnum.OnPlayerFirstEnterRoom, RoomInfo); - IsFirstEnterFlag = false; } EventManager.EmitEvent(EventEnum.OnPlayerEnterRoom, RoomInfo); + IsFirstEnterFlag = false; } diff --git a/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs b/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs index f52c690..09473fd 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs @@ -82,7 +82,8 @@ private void InsertItem() { //GD.Print("玩家进入过道"); - RoomDoorInfo.ClearFog(); + //RoomDoorInfo.ClearFog(); + FogMaskHandler.RefreshAisleFog(RoomDoorInfo); } // private void LeavePlayer() diff --git a/DungeonShooting_Godot/src/framework/map/fog/FogMaskBase.cs b/DungeonShooting_Godot/src/framework/map/fog/FogMaskBase.cs index fe1124f..abfe0f0 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/FogMaskBase.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMaskBase.cs @@ -10,12 +10,12 @@ /// /// 是否探索过迷雾 /// - public bool IsExplored { get; private set; } + public bool IsExplored { get; set; } /// /// 迷雾透明度值, 这个值在调用 TransitionAlpha() 时改变, 用于透明度判断 /// - public float TargetAlpha { get; protected set; } + public float TargetAlpha { get; set; } private long _cid = -1; @@ -23,27 +23,49 @@ /// 使颜色的 alpha 通道过渡到指定的值 /// /// 透明度值 - /// 过渡时间 - public void TransitionAlpha(float targetAlpha, float time) + public void TransitionAlpha(float targetAlpha) { TargetAlpha = targetAlpha; - if (targetAlpha > 0) - { - IsExplored = true; - } if (_cid >= 0) { World.Current.StopCoroutine(_cid); } - _cid = World.Current.StartCoroutine(RunTransitionAlpha(targetAlpha, time, false)); + _cid = World.Current.StartCoroutine(RunTransitionAlpha(targetAlpha, GameConfig.FogTransitionTime, false)); + } + + /// + /// 使颜色的 alpha 通道过渡到指定的值 + /// + /// 初始透明度 + /// 透明度值 + public void TransitionAlpha(float tartAlpha, float targetAlpha) + { + Color = new Color(1, 1, 1, tartAlpha); + TransitionAlpha(targetAlpha); + } + + /// + /// 使颜色的 alpha 通道过渡到 GameConfig.DarkFogAlpha + /// + public void TransitionToDark() + { + TransitionAlpha(GameConfig.DarkFogAlpha); + } + + /// + /// 使颜色的 alpha 通道过渡到 1 + /// + public void TransitionToLight() + { + TransitionAlpha(1); } /// /// 使颜色的 alpha 通道过渡到 0, 然后隐藏该 Fog /// /// 过渡时间 - public void TransitionToHide(float time) + public void TransitionToHide(float time = GameConfig.FogTransitionTime) { TargetAlpha = 0; if (Visible) diff --git a/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs b/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs new file mode 100644 index 0000000..3f2ccf3 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs @@ -0,0 +1,232 @@ + +using System; +using Godot; + +public static class FogMaskHandler +{ + private static RoomInfo _prevRoomInfo; + private static RoomInfo _tempRoomInfo; + private static RoomDoorInfo _tempDoorInfo; + + public static void RefreshRoomFog(RoomInfo roomInfo) + { + _tempRoomInfo = roomInfo; + } + + public static void RefreshAisleFog(RoomDoorInfo doorInfo) + { + if (_prevRoomInfo != null) + { + if (doorInfo.RoomInfo == _prevRoomInfo) + { + _tempDoorInfo = doorInfo; + } + else if (doorInfo.ConnectDoor.RoomInfo == _prevRoomInfo) + { + _tempDoorInfo = doorInfo.ConnectDoor; + } + return; + } + _tempDoorInfo = doorInfo; + } + + public static void Update() + { + if (_tempRoomInfo != null) + { + //刷新房间会附带刷新过道 + _RefreshRoomFog(_tempRoomInfo); + } + else if (_tempDoorInfo != null) + { + //刷新过道 + _RefreshAisleFog(_tempDoorInfo); + } + + _tempRoomInfo = null; + _tempDoorInfo = null; + } + + private static void _RefreshRoomFog(RoomInfo roomInfo) + { + if (_prevRoomInfo != roomInfo) + { + GD.Print($"切换房间: {_prevRoomInfo?.Id} => {roomInfo.Id}"); + if (_prevRoomInfo != null) + { + //房间变暗 + _prevRoomInfo.RoomFogMask.TransitionAlpha(GameConfig.DarkFogAlpha); + //刷新预览区域 + foreach (var roomInfoDoor in _prevRoomInfo.Doors) + { + //不是连接到当前房间的, 过道通通变暗 + if (roomInfoDoor.ConnectDoor.RoomInfo != roomInfo) + { + var prevAisleFog = roomInfoDoor.AisleFogMask; + if (!prevAisleFog.IsExplored) + { + roomInfoDoor.PreviewAisleFogMask.TransitionToDark(); + } + else + { + prevAisleFog.TransitionToDark(); + if (roomInfoDoor.ConnectDoor.PreviewRoomFogMask.Visible) + { + if (roomInfoDoor.ConnectDoor.RoomInfo.RoomFogMask.IsExplored) + { + roomInfoDoor.ConnectDoor.PreviewRoomFogMask.TransitionToHide(); + } + else + { + roomInfoDoor.ConnectDoor.PreviewRoomFogMask.TransitionToDark(); + } + } + } + } + } + } + + _prevRoomInfo = roomInfo; + } + GD.Print("RefreshRoomFog: " + roomInfo.Id); + var fogMask = roomInfo.RoomFogMask; + + if (!fogMask.IsExplored) //未探索该区域 + { + fogMask.IsExplored = true; + fogMask.TransitionAlpha(0, 1); + + //刷新预览区域 + foreach (var roomInfoDoor in roomInfo.Doors) + { + if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + { + _RefreshAisleFog(roomInfoDoor); + } + else //未探索 + { + //显示预览过道 + roomInfoDoor.PreviewRoomFogMask.SetActive(false); + roomInfoDoor.PreviewAisleFogMask.SetActive(true); + roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1); + } + } + } + else //已经探索过 + { + //变亮 + fogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 1); + + foreach (var roomInfoDoor in roomInfo.Doors) + { + if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + { + _RefreshAisleFog(roomInfoDoor); + } + else //未探索 + { + //显示预览过道 + roomInfoDoor.PreviewRoomFogMask.SetActive(false); + roomInfoDoor.PreviewAisleFogMask.SetActive(true); + roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1); + } + } + } + } + + private static void _RefreshAisleFog(RoomDoorInfo doorInfo) + { + GD.Print("RefreshAisleFog: " + doorInfo.RoomInfo.Id + doorInfo.Direction); + var fogMask = doorInfo.AisleFogMask; + + var connectDoor = doorInfo.ConnectDoor; + if (!fogMask.IsExplored) //未探索该区域 + { + fogMask.IsExplored = true; + doorInfo.PreviewAisleFogMask.IsExplored = true; + doorInfo.PreviewRoomFogMask.IsExplored = true; + doorInfo.ConnectDoor.PreviewAisleFogMask.IsExplored = true; + doorInfo.ConnectDoor.PreviewRoomFogMask.IsExplored = true; + fogMask.TransitionAlpha(1); + + //隐藏预览 + if (doorInfo.PreviewAisleFogMask.Visible) + { + doorInfo.PreviewAisleFogMask.TransitionToHide(); + } + + //显示下一个房间预览 + if (!connectDoor.RoomInfo.RoomFogMask.IsExplored) + { + connectDoor.PreviewRoomFogMask.SetActive(true); + connectDoor.PreviewRoomFogMask.TransitionAlpha(0, 1); + } + } + else //已经探索过 + { + if (doorInfo.Door.IsClose) //房间已经关门 + { + //过道迷雾变暗 + fogMask.TransitionToDark(); + //隐藏房间预览 + if (doorInfo.PreviewRoomFogMask.Visible) + { + doorInfo.PreviewRoomFogMask.TransitionToHide(); + } + //显示过道预览 + if (!doorInfo.PreviewAisleFogMask.Visible) + { + doorInfo.PreviewAisleFogMask.SetActive(true); + doorInfo.PreviewAisleFogMask.TransitionAlpha(0, 1 - doorInfo.AisleFogMask.TargetAlpha); + } + } + else + { + //过道迷雾变亮 + fogMask.TransitionToLight(); + + //隐藏房间预览 + if (doorInfo.PreviewRoomFogMask.Visible) + { + doorInfo.PreviewRoomFogMask.TransitionToHide(); + } + //隐藏过道预览 + if (doorInfo.PreviewAisleFogMask.Visible) + { + doorInfo.PreviewAisleFogMask.TransitionToHide(); + } + //连接的房间显示房间预览 + if (!connectDoor.PreviewRoomFogMask.Visible) + { + connectDoor.PreviewRoomFogMask.SetActive(true); + } + + var tempA = 1 - connectDoor.RoomInfo.RoomFogMask.TargetAlpha; + if (Math.Abs(connectDoor.PreviewRoomFogMask.TargetAlpha - tempA) > 0.001f) + { + if (connectDoor.RoomInfo.RoomFogMask.IsExplored) + { + connectDoor.PreviewRoomFogMask.TransitionAlpha(0, tempA); + } + else + { + connectDoor.PreviewRoomFogMask.TransitionAlpha(tempA); + } + } + + //连接的房间隐藏过道预览 + if (connectDoor.PreviewAisleFogMask.Visible) + { + connectDoor.PreviewAisleFogMask.TransitionToHide(); + } + } + } + } + + public static void ClearRecordRoom() + { + _prevRoomInfo = null; + _tempDoorInfo = null; + _tempRoomInfo = null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs index 73398a6..9e73a1d 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs @@ -80,11 +80,6 @@ public PreviewFogMask PreviewAisleFogMask; /// - /// 当前门连接的过道是否探索过 - /// - public bool IsExplored { get; private set; } = false; - - /// /// 世界坐标下的原点坐标, 单位: 像素 /// public Vector2I GetWorldOriginPosition() @@ -262,85 +257,4 @@ PreviewAisleFogMask.Destroy(); } } - - /// - /// 清除过道迷雾 - /// - public void ClearFog() - { - IsExplored = true; - ConnectDoor.IsExplored = true; - if (AisleFogMask != null && Math.Abs(AisleFogMask.Color.A - 1f) > 0.001f) - { - AisleFogMask.TransitionAlpha(1, GameConfig.FogTransitionTime); - RefreshPreviewFog(1); - } - } - - /// - /// 将过道迷雾变暗 - /// - public void DarkFog() - { - IsExplored = true; - ConnectDoor.IsExplored = true; - if (AisleFogMask != null && Math.Abs(AisleFogMask.Color.A - GameConfig.DarkFogAlpha) > 0.001f) - { - AisleFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - RefreshPreviewFog(GameConfig.DarkFogAlpha); - } - } - - /// - /// 刷新房间中的预览迷雾 - /// - /// 过道迷雾透明度 - public void RefreshPreviewFog(float aisleFogAlpha) - { - var room1Alpha = RoomInfo.RoomFogMask.TargetAlpha; - var room2Alpha = ConnectDoor.RoomInfo.RoomFogMask.TargetAlpha; - //GD.Print($"aisleFogAlpha: {aisleFogAlpha}, room1Alpha: {room1Alpha}, room2Alpha{room2Alpha}"); - - if ((aisleFogAlpha < 1 && room1Alpha < 1) || Math.Abs(aisleFogAlpha - room1Alpha) < 0.001f) //隐藏预览 - { - PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - } - else if (aisleFogAlpha >= 1) //预览房间 - { - PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - PreviewRoomFogMask.SetActive(true); - - //播放过渡动画 - var targetAlpha = 1 - room1Alpha; - PreviewRoomFogMask.Color = new Color(1, 1, 1, 0); - PreviewRoomFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); - } - else if (room1Alpha >= 1) //预览过道 - { - PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - PreviewAisleFogMask.SetActive(true); - } - - if ((aisleFogAlpha < 1 && room2Alpha < 1) || Math.Abs(aisleFogAlpha - room2Alpha) < 0.001f) //隐藏预览 - { - ConnectDoor.PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - ConnectDoor.PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - } - else if (aisleFogAlpha >= 1) //预览房间 - { - ConnectDoor.PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - ConnectDoor.PreviewRoomFogMask.SetActive(true); - - //播放过渡动画, 这里有问题 - var targetAlpha = 1 - room2Alpha; - ConnectDoor.PreviewRoomFogMask.Color = new Color(1, 1, 1, 0); - ConnectDoor.PreviewRoomFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); - } - else if (room2Alpha >= 1) //预览过道 - { - ConnectDoor.PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - ConnectDoor.PreviewAisleFogMask.SetActive(true); - } - } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs index 9f1a66d..93f52da 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -396,9 +396,10 @@ //过道迷雾 doorInfo.AisleFogArea.Monitoring = true; - if (doorInfo.IsExplored) + if (doorInfo.AisleFogMask.IsExplored) { - doorInfo.ClearFog(); + //doorInfo.ClearFog(); + FogMaskHandler.RefreshAisleFog(doorInfo); } } } @@ -420,106 +421,10 @@ //过道迷雾 doorInfo.AisleFogArea.Monitoring = false; - if (doorInfo.IsExplored) + if (doorInfo.AisleFogMask.IsExplored) { - doorInfo.DarkFog(); - } - } - } - - /// - /// 清除迷雾 - /// - public void ClearFog() - { - if (RoomFogMask != null && Math.Abs(RoomFogMask.Color.A - 1) > 0.001f) - { - RoomFogMask.TransitionAlpha(1, GameConfig.FogTransitionTime); - RefreshPreviewFog(1); - } - } - - /// - /// 将迷雾变暗, nextRoom: 下一个房间 - /// - public void DarkFog(RoomInfo nextRoom = null) - { - if (RoomFogMask != null && Math.Abs(RoomFogMask.Color.A - GameConfig.DarkFogAlpha) > 0.001f) - { - RoomFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - RefreshPreviewFog(GameConfig.DarkFogAlpha, nextRoom); - } - } - - /// - /// 刷新房间中的预览迷雾 - /// - /// 当前房间的迷雾透明度 - public void RefreshPreviewFog(float roomFogAlpha) - { - RefreshPreviewFog(roomFogAlpha, null); - } - - private void RefreshPreviewFog(float roomFogAlpha, RoomInfo nextRoom) - { - var isToDark = Math.Abs(roomFogAlpha - GameConfig.DarkFogAlpha) < 0.001f && nextRoom != null; - //预览迷雾 - foreach (var roomDoorInfo in Doors) - { - if (isToDark && roomDoorInfo.ConnectDoor.RoomInfo != nextRoom && roomDoorInfo.AisleFogMask.IsExplored) - { - //roomDoorInfo.AisleFogMask.Color = Colors.Red; - if (roomDoorInfo.PreviewAisleFogMask.TargetAlpha > GameConfig.DarkFogAlpha) - { - roomDoorInfo.PreviewAisleFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - } - if (roomDoorInfo.PreviewRoomFogMask.TargetAlpha > GameConfig.DarkFogAlpha) - { - roomDoorInfo.PreviewRoomFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - } - var connectDoor = roomDoorInfo.ConnectDoor; - if (connectDoor.PreviewAisleFogMask != null && connectDoor.PreviewAisleFogMask.TargetAlpha > GameConfig.DarkFogAlpha) - { - connectDoor.PreviewAisleFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - } - if (connectDoor.PreviewRoomFogMask != null && connectDoor.PreviewRoomFogMask.TargetAlpha > GameConfig.DarkFogAlpha) - { - connectDoor.PreviewRoomFogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); - } - } - else - { - var aisleAlpha = roomDoorInfo.AisleFogMask.TargetAlpha; - if (aisleAlpha < 1 && roomDoorInfo.AisleFogMask.IsExplored) - { - roomDoorInfo.AisleFogMask.TransitionAlpha(1, GameConfig.FogTransitionTime); - aisleAlpha = 1; - } - if ((roomFogAlpha < 1 && aisleAlpha < 1) || Math.Abs(roomFogAlpha - aisleAlpha) < 0.001f) //隐藏预览 - { - roomDoorInfo.PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - roomDoorInfo.PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - } - else if (aisleAlpha >= 1) //预览房间 - { - roomDoorInfo.PreviewAisleFogMask.TransitionToHide(GameConfig.FogTransitionTime); - roomDoorInfo.PreviewRoomFogMask.SetActive(true); - - //播放过渡动画 - var targetAlpha = 1 - roomFogAlpha; - roomDoorInfo.PreviewRoomFogMask.Color = new Color(1, 1, 1, 0); - roomDoorInfo.PreviewRoomFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); - } - else if (roomFogAlpha >= 1) //预览过道 - { - roomDoorInfo.PreviewRoomFogMask.TransitionToHide(GameConfig.FogTransitionTime); - roomDoorInfo.PreviewAisleFogMask.SetActive(true); - - //播放过渡动画 - var targetAlpha = 1 - aisleAlpha; - roomDoorInfo.PreviewAisleFogMask.Color = new Color(1, 1, 1, 0.2f); - roomDoorInfo.PreviewAisleFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); - } + //doorInfo.DarkFog(); + FogMaskHandler.RefreshAisleFog(doorInfo); } } } diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 0cc3ee0..a31c84a 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -172,6 +172,9 @@ UiManager.Open_PauseMenu(); } + //更新迷雾 + FogMaskHandler.Update(); + _checkEnemyTimer += (float)delta; if (_checkEnemyTimer >= 1) { @@ -297,6 +300,7 @@ World = null; GameApplication.Instance.DestroyWorld(); yield return 0; + FogMaskHandler.ClearRecordRoom(); QueueRedraw(); //鼠标还原 GameApplication.Instance.Cursor.SetGuiMode(true); @@ -432,16 +436,7 @@ { var roomFog = new FogMask(); roomFog.Name = "FogMask" + roomFog.IsDestroyed; - float alpha; - if (roomInfo.RoomType == DungeonRoomType.Inlet) //起始房间没有迷雾 - { - alpha = 1; - } - else - { - alpha = 0; - } - roomFog.InitFog(roomInfo.Position, roomInfo.Size, alpha); + roomFog.InitFog(roomInfo.Position, roomInfo.Size); World.FogMaskRoot.AddChild(roomFog); roomInfo.RoomFogMask = roomFog; @@ -545,9 +540,6 @@ previewAisleFog.SetActive(false); World.FogMaskRoot.AddChild(previewAisleFog); } - - //刷新预览迷雾 - roomInfo.RefreshPreviewFog(alpha); } /// @@ -583,19 +575,10 @@ var roomInfo = (RoomInfo)o; if (_affiliationAreaFlag != roomInfo.AffiliationArea) { - if (_affiliationAreaFlag != null) - { - if (!_affiliationAreaFlag.IsDestroyed) - { - //上一个房间变暗 - _affiliationAreaFlag.RoomInfo.DarkFog(roomInfo); - } - } - if (!roomInfo.AffiliationArea.IsDestroyed) { - //当前房间变亮 - roomInfo.ClearFog(); + //刷新迷雾 + FogMaskHandler.RefreshRoomFog(roomInfo); } _affiliationAreaFlag = roomInfo.AffiliationArea;