diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn index 44a10c1..a088659 100644 --- a/DungeonShooting_Godot/prefab/role/Role0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn @@ -45,6 +45,7 @@ texture = ExtResource("3_vx7tr") [node name="AnimatedSprite" parent="." index="2"] +visible = false material = SubResource("ShaderMaterial_8hgu2") sprite_frames = ExtResource("4_galcc") animation = &"roll" diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn index 9f257dd..f43ac80 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn @@ -37,7 +37,7 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -49,12 +49,36 @@ tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") +tracks/1/path = NodePath("AnimatedSprite:animation") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"default"] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimatedSprite:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), "update": 0, "values": [0.0] } @@ -65,10 +89,34 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:animation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { +"times": PackedFloat32Array(0, 1.3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [&"reloading_frame", &"default"] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 1.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0, 18] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { "times": PackedFloat32Array(0, 0.2, 1.1, 1.3), "transitions": PackedFloat32Array(1, 1, 1, 1), "update": 0, @@ -101,7 +149,6 @@ modulate = Color(1.9, 1.9, 1.9, 1) material = SubResource("ShaderMaterial_6odx4") sprite_frames = ExtResource("2_s0xbw") -animation = &"reloading" [node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(-2, -3) diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn index 75c740e..d4495c1 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn @@ -37,43 +37,43 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:animation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 0, -"values": [0.0] +"update": 1, +"values": [&"default"] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("AnimatedSprite:animation") +tracks/1/path = NodePath("AnimatedSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, -"values": [&"reloading_frame"] +"values": [0] } tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("AnimatedSprite:frame") +tracks/2/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] +"update": 0, +"values": [0.0] } tracks/3/type = "value" tracks/3/imported = false tracks/3/enabled = true -tracks/3/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") +tracks/3/path = NodePath("AnimatedSprite:rotation") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { @@ -90,39 +90,39 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:animation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0] +"times": PackedFloat32Array(0, 1.5), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [&"reloading_frame", &"default"] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("AnimatedSprite:animation") +tracks/1/path = NodePath("AnimatedSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [&"reloading_frame"] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("AnimatedSprite:frame") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { "times": PackedFloat32Array(0, 0.22, 0.24, 1.22, 1.24), "transitions": PackedFloat32Array(1, 1, 1, 1, 1), "update": 1, "values": [0, 1, 2, 3, 4] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(-0.02, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] _data = { @@ -149,7 +149,6 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_o36tv") sprite_frames = ExtResource("2_4kxpd") -animation = &"reloading_frame" [node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(-2, -2) diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json index 1579f73..7674f49 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-84,"Y":-46},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-85,"Y":-71},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-56,"Y":-72},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":30,"Y":75},"Size":{"X":29,"Y":28},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-88,"Y":70},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.8,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":65,"Y":-66},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-84,"Y":-46},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-56,"Y":-72},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":30,"Y":75},"Size":{"X":29,"Y":28},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"-1","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-88,"Y":70},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.8,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":65,"Y":-66},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres index 1dfc8d7..f6d578c 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres @@ -148,6 +148,6 @@ "texture": SubResource("AtlasTexture_ol1l8") }], "loop": false, -"name": &"reloading", +"name": &"reloading_frame", "speed": 11.0 }] diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs index 8cd04b7..47aa18d 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs @@ -284,6 +284,15 @@ LookTarget = target; StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiTailAfter); } + else if (state == AIStateEnum.AiFindAmmo) + { + if (LookTarget == null) + { + LookTarget = target; + var findAmmo = (AiFindAmmoState)StateController.CurrStateBase; + StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, findAmmo.TargetWeapon); + } + } } /// diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs index 108652c..9e71f84 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs @@ -9,8 +9,10 @@ /// public class AiFindAmmoState : StateBase { - - private Weapon _target; + /// + /// 目标武器 + /// + public Weapon TargetWeapon; //导航目标点刷新计时器 private float _navigationUpdateTimer = 0; @@ -39,7 +41,7 @@ } else { - _attackTarget = null; + _attackTarget = Master.LookTarget; } SetTargetWeapon((Weapon)args[0]); @@ -47,7 +49,7 @@ _tailAfterTimer = 0; //标记武器 - _target.SetSign(SignNames.AiFindWeaponSign, Master); + TargetWeapon.SetSign(SignNames.AiFindWeaponSign, Master); _playAnimFlag = prev == AIStateEnum.AiLeaveFor; if (_playAnimFlag) @@ -82,7 +84,7 @@ //发现玩家 Master.LookTarget = player; //进入惊讶状态, 然后再进入通知状态 - ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, _target); + ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, TargetWeapon); return; } } @@ -92,7 +94,7 @@ { //每隔一段时间秒更改目标位置 _navigationUpdateTimer = _navigationInterval; - var position = _target.GlobalPosition; + var position = TargetWeapon.GlobalPosition; Master.NavigationAgent2D.TargetPosition = position; } else @@ -100,26 +102,26 @@ _navigationUpdateTimer -= delta; } - if (_target.IsDestroyed || _target.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走 + if (TargetWeapon.IsDestroyed || TargetWeapon.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走 { //再去寻找其他武器 SetTargetWeapon(Master.FindTargetWeapon()); - if (_target == null) //也没有其他可用的武器了 + if (TargetWeapon == null) //也没有其他可用的武器了 { RunNextState(); } } - else if (_target.Master == Master) //已经被自己拾起 + else if (TargetWeapon.Master == Master) //已经被自己拾起 { RunNextState(); } - else if (_target.Master != null) //武器已经被其他角色拾起! + else if (TargetWeapon.Master != null) //武器已经被其他角色拾起! { //再去寻找其他武器 SetTargetWeapon(Master.FindTargetWeapon()); - if (_target == null) //也没有其他可用的武器了 + if (TargetWeapon == null) //也没有其他可用的武器了 { RunNextState(); } @@ -172,19 +174,19 @@ private void SetTargetWeapon(Weapon weapon) { - _target = weapon; + TargetWeapon = weapon; if (weapon != null) { //设置目标点 - Master.NavigationAgent2D.TargetPosition = _target.GlobalPosition; + Master.NavigationAgent2D.TargetPosition = TargetWeapon.GlobalPosition; } } public override void DebugDraw() { - if (_target != null) + if (TargetWeapon != null) { - Master.DrawLine(Vector2.Zero, Master.ToLocal(_target.GlobalPosition), Colors.Purple); + Master.DrawLine(Vector2.Zero, Master.ToLocal(TargetWeapon.GlobalPosition), Colors.Purple); if (Master.LookTarget != null) { diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index e624a3b..9a0e3ac 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -285,7 +285,8 @@ public override void OnInit() { InitWeapon(GetWeaponAttribute(ActivityBase.Id).Clone()); - AnimatedSprite.AnimationFinished += OnAnimationFinished; + AnimatedSprite.AnimationFinished += OnAnimatedSpriteFinished; + AnimationPlayer.AnimationFinished += OnAnimationPlayerFinished; } /// @@ -1610,12 +1611,21 @@ } //帧动画播放结束 - private void OnAnimationFinished() + private void OnAnimatedSpriteFinished() { // Debug.Log("帧动画播放结束..."); AnimatedSprite.Play(AnimatorNames.Default); } + //动画播放器播放结束 + private void OnAnimationPlayerFinished(StringName name) + { + if (Master != null && !IsActive) + { + Master.OnPutBackMount(this, PackageIndex); + } + } + public override CheckInteractiveResult CheckInteractive(ActivityObject master) { var result = new CheckInteractiveResult(this); @@ -1821,6 +1831,12 @@ /// private void Conceal() { + //停止换弹动画 + if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying()) + { + AnimationPlayer.Play(AnimatorNames.Reset); + } + HideShadowSprite(); OnConceal(); } @@ -1844,6 +1860,11 @@ { StopReload(); } + //停止换弹动画 + if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying()) + { + AnimationPlayer.Play(AnimatorNames.Reset); + } OnRemove(Master); } diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs index 8ee5992..6b24e90 100644 --- a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs @@ -168,7 +168,7 @@ Input.IsMouseButtonPressed(MouseButton.Right)) { //执行传送操作 - DoTransmission(_mouseHoverRoom.Waypoints * GameConfig.TileCellSize); + DoTransmission((_mouseHoverRoom.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize); ResetMap(); _isMagnifyMap = false; World.Current.Pause = false; diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs index 2b9b7db..fe8d33e 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs @@ -1,5 +1,4 @@ -using Godot; using UI.BottomTips; namespace UI.RoomUI;