diff --git a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs index 81b65e3..a173308 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs @@ -97,6 +97,7 @@ //上一个房间 private RoomInfo prevRoomInfo = null; + private readonly List _tempList = new List(); public DungeonGenerator(DungeonConfig config, SeedRandom seedRandom) { @@ -423,6 +424,14 @@ Debug.LogError("当前房间还有连接的子房间, 不能回滚!"); return false; } + + if (!roomInfo.CanRollback) + { + Debug.LogError("当前房间不能回滚!"); + return false; + } + var prevRoom = roomInfo.Prev; + //退掉占用的房间区域和过道占用区域 _roomGrid.RemoveRect(roomInfo.Position, roomInfo.Size); foreach (var rect2 in roomInfo.AisleArea) @@ -431,7 +440,7 @@ } //roomInfo.Doors[0]. - if (roomInfo.Prev != null) + if (prevRoom != null) { roomInfo.Prev.Next.Remove(roomInfo); } @@ -471,6 +480,7 @@ roomInfo.Destroy(); _id--; _nextRoomType = DungeonRoomType.None; + SetPrevRoom(prevRoom); return true; } @@ -483,6 +493,10 @@ RoomInfo temp = null; foreach (var roomInfo in RoomInfos) { + if (roomInfo.CanRollback) + { + continue; + } if (temp == null || roomInfo.Layer > temp.Layer) { if (exclude == null || !exclude.Contains(roomInfo)) @@ -498,18 +512,51 @@ /// /// 随机抽取层级小于 layer 的房间 /// - public RoomInfo RoundRoomLessThanLayer(int layer) + public RoomInfo RandomRoomLessThanLayer(int layer) { - var list = new List(); + _tempList.Clear(); foreach (var roomInfo in RoomInfos) { + if (roomInfo.CanRollback) + { + continue; + } if (roomInfo.Layer < layer) { - list.Add(roomInfo); + _tempList.Add(roomInfo); } } - return Random.RandomChoose(list); + return Random.RandomChoose(_tempList); + } + + /// + /// 随机抽取房间 + /// + public RoomInfo GetRandomRoom() + { + _tempList.Clear(); + foreach (var roomInfo in RoomInfos) + { + if (roomInfo.CanRollback) + { + continue; + } + _tempList.Add(roomInfo); + } + + return Random.RandomChoose(_tempList); + } + + /// + /// 提交所有可以回滚的房间 + /// + public void SubmitCanRollbackRoom() + { + foreach (var roomInfo in RoomInfos) + { + roomInfo.CanRollback = false; + } } /// diff --git a/DungeonShooting_Godot/src/game/GameApplication.cs b/DungeonShooting_Godot/src/game/GameApplication.cs index 4fa38b8..32add5e 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -106,7 +106,7 @@ DungeonConfig = new DungeonConfig(); DungeonConfig.GroupName = "Test1"; - DungeonConfig.BattleRoomCount = 5; + DungeonConfig.BattleRoomCount = 20; } public override void _EnterTree() diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index ded755a..5fd28f9 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -61,20 +61,7 @@ ActivePropsPack.SetCapacity(1); // debug用 - RoleState.Acceleration = 3000; - RoleState.Friction = 3000; - RoleState.MoveSpeed = 500; - CollisionLayer = 0; - CollisionMask = 0; - GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f); - //GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f); - // this.CallDelay(0.5f, () => - // { - // PickUpWeapon(Create(Ids.Id_weapon0009)); - // PickUpWeapon(Create(Ids.Id_weapon0008)); - // PickUpWeapon(Create(Ids.Id_weapon0007)); - // PickUpWeapon(Create(Ids.Id_weapon0006)); - // }); + DebugSet(); //注册状态机 StateController.Register(new PlayerIdleState()); @@ -88,6 +75,37 @@ _brushData2 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0001"]); } + private void DebugSet() + { + RoleState.Acceleration = 3000; + RoleState.Friction = 3000; + RoleState.MoveSpeed = 500; + CollisionLayer = 0; + CollisionMask = 0; + GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f); + // this.CallDelay(0.5f, () => + // { + // PickUpWeapon(Create(Ids.Id_weapon0009)); + // PickUpWeapon(Create(Ids.Id_weapon0008)); + // PickUpWeapon(Create(Ids.Id_weapon0007)); + // PickUpWeapon(Create(Ids.Id_weapon0006)); + // }); + World.Color = new Color(1, 1, 1, 1); //关闭迷雾 + //显示房间小地图 + this.CallDelay(1, () => + { + GameApplication.Instance.DungeonManager.StartRoomInfo.EachRoom(info => + { + info.PreviewSprite.Visible = true; + foreach (var roomDoorInfo in info.Doors) + { + roomDoorInfo.AislePreviewSprite.Visible = true; + } + }); + }); + +} + protected override RoleState OnCreateRoleState() { var roleState = new PlayerRoleState(); diff --git a/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs b/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs index abc3bea..2b75d05 100644 --- a/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs +++ b/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs @@ -9,8 +9,13 @@ { //用于排除上一级房间 private List excludePrevRoom = new List(); - private int chainTryCount = 0; - private int chainMaxTryCount = 3; + + //战斗房间尝试链接次数 + private int battleTryCount = 0; + private int battleMaxTryCount = 3; + + //结束房间尝试链接次数 + private int outletTryCount = 0; public DefaultDungeonRule(DungeonGenerator generator) : base(generator) { @@ -37,26 +42,18 @@ } else if (nextRoomType == DungeonRoomType.Battle) { - if (chainTryCount < chainMaxTryCount) + if (battleTryCount < battleMaxTryCount) { if (prevRoomInfo != null && prevRoomInfo.Layer >= Config.MaxLayer - 1) //层数太高, 下一个房间生成在低层级 { - return Generator.RoundRoomLessThanLayer(Mathf.Max(1, Config.MaxLayer / 2)); + return Generator.RandomRoomLessThanLayer(Mathf.Max(1, Config.MaxLayer / 2)); } - else - { - return prevRoomInfo; - } - } - else - { - return Random.RandomChoose(Generator.RoomInfos); + + return prevRoomInfo; } } - else - { - return Random.RandomChoose(Generator.RoomInfos); - } + + return Generator.GetRandomRoom(); } public override DungeonRoomType GetNextRoomType(RoomInfo prevRoomInfo) @@ -97,8 +94,18 @@ } else if (roomInfo.RoomType == DungeonRoomType.Battle) { - chainTryCount = 0; - chainMaxTryCount = Random.RandomRangeInt(1, 3); + battleTryCount = 0; + battleMaxTryCount = Random.RandomRangeInt(1, 3); + } + else if (roomInfo.RoomType == DungeonRoomType.Outlet) + { + outletTryCount = 0; + Generator.SubmitCanRollbackRoom(); + } + + if (prevRoomInfo != null && prevRoomInfo.CanRollback) + { + roomInfo.CanRollback = true; } } @@ -116,17 +123,16 @@ } else if (roomType == DungeonRoomType.Outlet) { - //生成结束房间失败, 那么只能回滚boss房间 - if (prevRoomInfo != null) + outletTryCount++; + if (outletTryCount >= 3 && prevRoomInfo != null) //生成结束房间失败, 那么只能回滚boss房间 { - var bossPrev = prevRoomInfo.Prev; + outletTryCount = 0; Generator.RollbackRoom(prevRoomInfo); - Generator.SetPrevRoom(bossPrev); } } else if (roomType == DungeonRoomType.Battle) { - chainTryCount++; + battleTryCount++; } } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/World.cs b/DungeonShooting_Godot/src/game/room/World.cs index 1057494..af57174 100644 --- a/DungeonShooting_Godot/src/game/room/World.cs +++ b/DungeonShooting_Godot/src/game/room/World.cs @@ -81,7 +81,7 @@ public override void _Ready() { - //Color = Colors.Black; + Color = Colors.Black; //TileRoot.YSortEnabled = false; NormalLayer = GetNode("TileRoot/NormalLayer"); YSortLayer = GetNode("TileRoot/YSortLayer"); diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs index 6d50aab..ca80d6c 100644 --- a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs @@ -159,9 +159,10 @@ S_Mark.Instance.Position = S_DrawContainer.Instance.Size / 2 + _mapOffset; } + var area = Player.Current.AffiliationArea; //传送 if (_pressMapFlag && _mouseHoverRoom != null && - !Player.Current.AffiliationArea.RoomInfo.IsSeclusion && + area != null && !area.RoomInfo.IsSeclusion && Input.IsMouseButtonPressed(MouseButton.Right)) { //执行传送操作 @@ -245,14 +246,18 @@ var shaderMaterial = (ShaderMaterial)roomInfo.PreviewSprite.Material; _originOutlineColor = shaderMaterial.GetShaderParameter("outline_color").AsColor(); //玩家所在的房间门是否打开 - var isOpen = !Player.Current.AffiliationArea.RoomInfo.IsSeclusion; - if (isOpen) + var area = Player.Current.AffiliationArea; + if (area != null) { - shaderMaterial.SetShaderParameter("outline_color", new Color(0, 1, 0, 0.9f)); - } - else - { - shaderMaterial.SetShaderParameter("outline_color", new Color(1, 0, 0, 0.9f)); + var isOpen = !area.RoomInfo.IsSeclusion; + if (isOpen) + { + shaderMaterial.SetShaderParameter("outline_color", new Color(0, 1, 0, 0.9f)); + } + else + { + shaderMaterial.SetShaderParameter("outline_color", new Color(1, 0, 0, 0.9f)); + } } }; roomInfo.PreviewSprite.MouseExited += () =>