diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json index 5a69f26..1e5adb4 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":178,"Y":-21},"Size":{"X":92,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":76,"Y":140},"Size":{"X":43,"Y":77},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":178,"Y":-21},"Size":{"X":92,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":76,"Y":140},"Size":{"X":43,"Y":77},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":89,"Y":19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":78,"Y":89},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json index 0bb0387..e81e616 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":8,"Y":19},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":8,"Y":19},"Size":{"X":83,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":8,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":8,"Y":19},"Size":{"X":83,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":11,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":-13,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs index f26b489..f5b5942 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs @@ -50,6 +50,26 @@ private int _currWaveIndex = 0; //执行生成标记的协程id private long _coroutineId = -1; + //提前加载列表 + private List _readyList; + + private class PreloadData + { + /// + /// 实例对象 + /// + public ActivityObject ActivityObject; + /// + /// 所在层级 + /// + public RoomLayerEnum Layer; + + public PreloadData(ActivityObject activityObject, RoomLayerEnum layer) + { + ActivityObject = activityObject; + Layer = layer; + } + } public RoomPreinstall(RoomInfo roomInfo, RoomPreinstallInfo roomPreinstallInfo) { @@ -164,6 +184,7 @@ public void OnReady() { _currWaveIndex = 0; + //加载提前生成的物体 if (WaveList.Count > 0) { var activityMarks = WaveList[0]; @@ -174,7 +195,11 @@ var activityObject = CreateItem(activityMark); //初始化属性 InitAttr(activityObject, activityMark); - activityObject.PutDown(GetDefaultLayer(activityMark)); + if (_readyList == null) + { + _readyList = new List(); + } + _readyList.Add(new PreloadData(activityObject, GetDefaultLayer(activityMark))); } } } @@ -193,13 +218,35 @@ } IsRunWave = true; - + _currWaveIndex = 1; - //判断房间内是否已经有敌人了, 没有才能执行第1波 - var flag = RoomInfo.AffiliationArea.ExistEnterItem( - activityObject => activityObject.CollisionWithMask(PhysicsLayer.Enemy) - ); - if (!flag) + //判断房间内是否已经有敌人了 + var hasEnemy = false; + if (_readyList != null && _readyList.Count > 0) + { + foreach (var preloadData in _readyList) + { + //有敌人 + if (!hasEnemy && preloadData.ActivityObject.CollisionWithMask(PhysicsLayer.Enemy)) + { + hasEnemy = true; + } + + preloadData.ActivityObject.PutDown(preloadData.Layer); + } + + _readyList.Clear(); + _readyList = null; + } + + if (!hasEnemy) + { + hasEnemy = RoomInfo.AffiliationArea.ExistIncludeItem( + activityObject => activityObject.CollisionWithMask(PhysicsLayer.Enemy) + ); + } + + if (!hasEnemy) //没有敌人才能执行第1波 { if (_currWaveIndex < WaveList.Count) { @@ -210,13 +257,29 @@ } } + /// + /// 执行下一波 + /// public void NextWave() { + if (!IsRunWave) + { + return; + } + GD.Print($"执行第{_currWaveIndex}波"); _coroutineId = GameApplication.Instance.StartCoroutine(RunMark(WaveList[_currWaveIndex])); _currWaveIndex++; } + /// + /// 结束生成标记 + /// + public void OverWave() + { + IsRunWave = false; + } + //执行实例化标记物体 private IEnumerator RunMark(List activityMarks) { @@ -339,6 +402,15 @@ } WaveList.Clear(); + if (_readyList != null) + { + foreach (var preloadData in _readyList) + { + preloadData.ActivityObject.Destroy(); + } + + _readyList.Clear(); + } } //初始化物体属性 diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs index 0d80a2b..bc905ec 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -208,23 +208,31 @@ return; } - //会刷新敌人才要关门 - var enemies = GameApplication.Instance.DungeonManager.World.Enemy_InstanceList; - if (RoomPreinstall.HasEnemy() || - enemies.FindIndex(item => item.AffiliationArea == AffiliationArea) != -1) + //房间内有敌人, 或者会刷新敌人才会关门 + var hasEnemy = false; + if (AffiliationArea.ExistEnterItem(activityObject => activityObject.CollisionWithMask(PhysicsLayer.Enemy))) //先判断房间里面是否有敌人 { - //关门 - foreach (var doorInfo in Doors) - { - doorInfo.Door.CloseDoor(); - } - IsSeclusion = true; + hasEnemy = true; } - else if (RoomPreinstall.WaveCount <= 1) //没有额外标记, 啥都不要做 + else if (RoomPreinstall.HasEnemy()) //在判断是否会刷出敌人 + { + hasEnemy = true; + } + + if (!hasEnemy) //没有敌人, 不关门 { IsSeclusion = false; + //执行第一波生成 + RoomPreinstall.StartWave(); return; } + + //关门 + foreach (var doorInfo in Doors) + { + doorInfo.Door.CloseDoor(); + } + IsSeclusion = true; //执行第一波生成 RoomPreinstall.StartWave(); @@ -246,26 +254,12 @@ doorInfo.Door.OpenDoor(); } } + //所有标记执行完成 + RoomPreinstall.OverWave(); } else //执行下一波 { - NextWave(); + RoomPreinstall.NextWave(); } } - - /// - /// 返回当前这一波所有的标记的 Doing 函数是否执行完成 - /// - public bool IsCurrWaveOver() - { - return RoomPreinstall.IsCurrWaveOver(); - } - - /// - /// 执行下一轮标记 - /// - private void NextWave() - { - RoomPreinstall.NextWave(); - } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 201fe24..7655681 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -520,11 +520,11 @@ private void OnCheckEnemy() { var activeRoom = ActiveRoomInfo; - if (activeRoom != null)// && //activeRoom.IsSeclusion) + if (activeRoom != null) { - if (activeRoom.IsSeclusion) //房间处于关上状态 + if (activeRoom.RoomPreinstall.IsRunWave) //正在生成标记 { - if (activeRoom.IsCurrWaveOver()) //所有标记执行完成 + if (activeRoom.RoomPreinstall.IsCurrWaveOver()) //所有标记执行完成 { //房间内是否有存活的敌人 var flag = ActiveAffiliationArea.ExistEnterItem( diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs index dcc07f0..83cfad6 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs @@ -79,6 +79,10 @@ public void RefreshGroup() { var index = _groupGrid.SelectIndex; + if (index == -1) + { + index = 0; + } MapProjectManager.RefreshMapGroup(); OnSearchGroupButtonClick(); _groupGrid.SelectIndex = index;