diff --git a/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs b/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs index 117e128..09ca317 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs @@ -109,6 +109,7 @@ var c = Color; c.A = alpha; Color = c; + TargetAlpha = alpha; } /// diff --git a/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs b/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs index 008d4cb..fe51f87 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs @@ -1,4 +1,6 @@  +using System; +using System.Collections; using Godot; /// @@ -28,10 +30,16 @@ /// public PreviewFogType FogType { get; private set; } + /// + /// 迷雾透明度值, 这个值在调用 TransitionAlpha() 时改变, 用于透明度判断 + /// + public float TargetAlpha { get; private set; } + private float _previewAisleAngle; private float _previewRoomAngle; private Vector2 _previewAislePosition; private Vector2 _previewRoomPosition; + private long _cid; private static void InitTexture() { @@ -55,17 +63,84 @@ DoorInfo = doorInfo; if (doorInfo.Direction == DoorDirection.E) { - _previewAislePosition = doorInfo.Door.GlobalPosition + new Vector2(16, 0); + _previewAislePosition = doorInfo.Door.GlobalPosition + new Vector2(GameConfig.TileCellSize, 0); _previewAisleAngle = 90; + + _previewRoomPosition = doorInfo.Door.GlobalPosition + new Vector2(-GameConfig.TileCellSize, 0); + _previewRoomAngle = 270; } else if (doorInfo.Direction == DoorDirection.W) { - _previewRoomPosition = doorInfo.Door.GlobalPosition + new Vector2(16, 0); + _previewAislePosition = doorInfo.Door.GlobalPosition + new Vector2(-GameConfig.TileCellSize, 0); + _previewAisleAngle = 270; + + _previewRoomPosition = doorInfo.Door.GlobalPosition + new Vector2(GameConfig.TileCellSize, 0); _previewRoomAngle = 90; } + else if (doorInfo.Direction == DoorDirection.N) + { + _previewAislePosition = doorInfo.Door.GlobalPosition + new Vector2(0, -GameConfig.TileCellSize); + _previewAisleAngle = 0; + + _previewRoomPosition = doorInfo.Door.GlobalPosition + new Vector2(0, GameConfig.TileCellSize); + _previewRoomAngle = 180; + } + else if (doorInfo.Direction == DoorDirection.S) + { + _previewAislePosition = doorInfo.Door.GlobalPosition; + _previewAisleAngle = 180; + + _previewRoomPosition = doorInfo.Door.GlobalPosition + new Vector2(0, -GameConfig.TileCellSize * 2); + _previewRoomAngle = 0; + } RefreshPreviewFogType(PreviewFogType.Aisle); } + + /// + /// 使颜色的 alpha 通道过渡到指定的值 + /// + /// 透明度值 + /// 过渡时间 + public void TransitionAlpha(float targetAlpha, float time) + { + TargetAlpha = targetAlpha; + if (_cid >= 0) + { + World.Current.StopCoroutine(_cid); + } + + _cid = World.Current.StartCoroutine(RunTransitionAlpha(targetAlpha, time, false)); + } + + public void TransitionToHide(float time) + { + TargetAlpha = 0; + if (_cid >= 0) + { + World.Current.StopCoroutine(_cid); + } + + _cid = World.Current.StartCoroutine(RunTransitionAlpha(TargetAlpha, time, true)); + } + + private IEnumerator RunTransitionAlpha(float targetAlpha, float time, bool hide) + { + var originColor = Color; + var a = originColor.A; + var delta = Mathf.Abs(a - targetAlpha) / time; + while (Math.Abs(a - targetAlpha) > 0.001f) + { + a = Mathf.MoveToward(a, targetAlpha, delta * (float)World.Current.GetProcessDeltaTime()); + Color = new Color(1, 1, 1, a); + yield return null; + } + _cid = -1; + if (hide) + { + this.SetActive(false); + } + } /// /// 更新预览迷雾类型 diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs index ec4dcaa..cdf06f7 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs @@ -257,8 +257,8 @@ ConnectDoor.IsExplored = true; if (FogMask != null && Math.Abs(FogMask.Color.A - 1f) > 0.001f) { + FogMask.TransitionAlpha(1, GameConfig.FogTransitionTime); RefreshPreviewFog(1); - FogMask.TransitionAlpha(1, 0.3f); } } @@ -271,8 +271,8 @@ ConnectDoor.IsExplored = true; if (FogMask != null && Math.Abs(FogMask.Color.A - GameConfig.DarkFogAlpha) > 0.001f) { + FogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); RefreshPreviewFog(GameConfig.DarkFogAlpha); - FogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 0.3f); } } @@ -284,15 +284,21 @@ { var room1Alpha = RoomInfo.FogMask.TargetAlpha; var room2Alpha = ConnectDoor.RoomInfo.FogMask.TargetAlpha; + //GD.Print($"aisleFogAlpha: {aisleFogAlpha}, room1Alpha: {room1Alpha}, room2Alpha{room2Alpha}"); - if (aisleFogAlpha < 1 && room1Alpha < 1) //隐藏预览 + if ((aisleFogAlpha < 1 && room1Alpha < 1) || Math.Abs(aisleFogAlpha - room1Alpha) < 0.001f) //隐藏预览 { - PreviewFogMask.SetActive(false); + PreviewFogMask.TransitionToHide(GameConfig.FogTransitionTime); } else if (aisleFogAlpha >= 1) //预览房间 { PreviewFogMask.SetActive(true); PreviewFogMask.SetPreviewFogType(PreviewFogMask.PreviewFogType.Room); + + //播放过渡动画 + var targetAlpha = 1 - room1Alpha; + PreviewFogMask.Color = new Color(1, 1, 1, 0); + PreviewFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); } else if (room1Alpha >= 1) //预览过道 { @@ -300,14 +306,19 @@ PreviewFogMask.SetPreviewFogType(PreviewFogMask.PreviewFogType.Aisle); } - if (aisleFogAlpha < 1 && room2Alpha < 1) //隐藏预览 + if ((aisleFogAlpha < 1 && room2Alpha < 1) || Math.Abs(aisleFogAlpha - room2Alpha) < 0.001f) //隐藏预览 { - ConnectDoor.PreviewFogMask.SetActive(false); + ConnectDoor.PreviewFogMask.TransitionToHide(GameConfig.FogTransitionTime); } else if (aisleFogAlpha >= 1) //预览房间 { ConnectDoor.PreviewFogMask.SetActive(true); ConnectDoor.PreviewFogMask.SetPreviewFogType(PreviewFogMask.PreviewFogType.Room); + + //播放过渡动画, 这里有问题 + var targetAlpha = 1 - room2Alpha; + ConnectDoor.PreviewFogMask.Color = new Color(1, 1, 1, 0); + ConnectDoor.PreviewFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); } else if (room2Alpha >= 1) //预览过道 { diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs index 49da2e7..cf6f2bc 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -434,8 +434,8 @@ { if (FogMask != null && Math.Abs(FogMask.Color.A - 1) > 0.001f) { + FogMask.TransitionAlpha(1, GameConfig.FogTransitionTime); RefreshPreviewFog(1); - FogMask.TransitionAlpha(1, 0.3f); } } @@ -446,8 +446,8 @@ { if (FogMask != null && Math.Abs(FogMask.Color.A - GameConfig.DarkFogAlpha) > 0.001f) { + FogMask.TransitionAlpha(GameConfig.DarkFogAlpha, GameConfig.FogTransitionTime); RefreshPreviewFog(GameConfig.DarkFogAlpha); - FogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 0.3f); } } @@ -461,19 +461,30 @@ foreach (var roomDoorInfo in Doors) { var aisleAlpha = roomDoorInfo.FogMask.TargetAlpha; - if (roomFogAlpha < 1 && aisleAlpha < 1) //隐藏预览 + if ((roomFogAlpha < 1 && aisleAlpha < 1) || Math.Abs(roomFogAlpha - aisleAlpha) < 0.001f) //隐藏预览 { - roomDoorInfo.PreviewFogMask.SetActive(false); + roomDoorInfo.PreviewFogMask.TransitionToHide(GameConfig.FogTransitionTime); } else if (aisleAlpha >= 1) //预览房间 { roomDoorInfo.PreviewFogMask.SetActive(true); roomDoorInfo.PreviewFogMask.SetPreviewFogType(PreviewFogMask.PreviewFogType.Room); + + //播放过渡动画 + var targetAlpha = 1 - roomFogAlpha; + roomDoorInfo.PreviewFogMask.Color = new Color(1, 1, 1, 0); + roomDoorInfo.PreviewFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); } else if (roomFogAlpha >= 1) //预览过道 { roomDoorInfo.PreviewFogMask.SetActive(true); roomDoorInfo.PreviewFogMask.SetPreviewFogType(PreviewFogMask.PreviewFogType.Aisle); + + //播放过渡动画 + var targetAlpha = 1 - aisleAlpha; + //GD.Print("targetAlpha: " + targetAlpha); + roomDoorInfo.PreviewFogMask.Color = new Color(1, 1, 1, 0.2f); + roomDoorInfo.PreviewFogMask.TransitionAlpha(targetAlpha, GameConfig.FogTransitionTime); } } } diff --git a/DungeonShooting_Godot/src/game/GameApplication.cs b/DungeonShooting_Godot/src/game/GameApplication.cs index 34e9761..f38af41 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -96,7 +96,7 @@ DungeonConfig = new DungeonConfig(); DungeonConfig.GroupName = RoomConfig.FirstOrDefault().Key; - DungeonConfig.RoomCount = 10; + DungeonConfig.RoomCount = 1; } public override void _EnterTree() diff --git a/DungeonShooting_Godot/src/game/GameConfig.cs b/DungeonShooting_Godot/src/game/GameConfig.cs index 046c27a..932ab28 100644 --- a/DungeonShooting_Godot/src/game/GameConfig.cs +++ b/DungeonShooting_Godot/src/game/GameConfig.cs @@ -82,4 +82,9 @@ /// 变暗迷雾的透明度值 /// public const float DarkFogAlpha = 0.2f; + + /// + /// 迷雾过渡时间 + /// + public const float FogTransitionTime = 0.3f; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index 61ad2ec..48bec61 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -165,6 +165,14 @@ Hp = 0; Hurt(1000, 0); } + else if (Input.IsKeyPressed(Key.O)) //测试用, 消灭房间内所有敌人 + { + var enemyList = AffiliationArea.FindIncludeItems(o => o.CollisionWithMask(PhysicsLayer.Enemy)); + foreach (var enemy in enemyList) + { + ((Enemy)enemy).Hurt(1000, 0); + } + } } // protected override void PhysicsProcess(float delta)