diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn index 196f400..b8e436d 100644 --- a/DungeonShooting_Godot/prefab/role/Role0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn @@ -44,6 +44,3 @@ [node name="AnimatedSprite" parent="." index="2"] material = SubResource("ShaderMaterial_8hgu2") sprite_frames = ExtResource("4_galcc") - -[node name="MountPoint" parent="." index="6"] -position = Vector2(2, -8) diff --git a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn b/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn index d55de02..2217fee 100644 --- a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn +++ b/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn @@ -69,5 +69,5 @@ shape = SubResource("RectangleShape2D_n68nu") [node name="MountPoint" type="Marker2D" parent="."] -position = Vector2(1, -6) +position = Vector2(2, -8) script = ExtResource("2_5ddpw") diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index e7f84b4..c36c7b6 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -114,32 +114,32 @@ } move_left={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":97,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) ] } move_right={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":100,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) ] } move_up={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":119,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) ] } move_down={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) ] } exchangeWeapon={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":113,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"echo":false,"script":null) ] } throwWeapon={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":103,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"echo":false,"script":null) ] } mouse_roll_up={ @@ -154,32 +154,32 @@ } interactive={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":101,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null) ] } reload={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":114,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null) ] } meleeAttack={ "deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(34.8, 12.8),"global_position":Vector2(38, 46),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) ] } roll={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(75, 15),"global_position":Vector2(79, 56),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } useActiveProp={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":102,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"echo":false,"script":null) ] } removeProp={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":120,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"echo":false,"script":null) ] } 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 131108d..1c55d41 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":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":10,"Y":22},"Size":{"X":0,"Y":0},"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":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-12,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"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":10,"Y":22},"Size":{"X":0,"Y":0},"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":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-12,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-36,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":56,"Y":-24},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs index 124220e..feba74b 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs @@ -127,7 +127,6 @@ { var d = damage; damage = Role.RoleState.CallCalcDamageEvent(damage); - GD.Print($"原伤害: {d}, 计算伤害: {damage}"); } role.CallDeferred(nameof(Role.Hurt), damage, Rotation); diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs index ce037b4..ac660c5 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs @@ -33,7 +33,7 @@ private int _count = 1; /// - /// 道具最大可使用次数 + /// 道具最大叠加用次数 /// public int MaxCount { @@ -238,7 +238,10 @@ player.ThrowActiveProp(player.ActivePropsPack.ActiveIndex); } //替换手中的道具 - player.PickUpActiveProp(this); + if (player.PickUpActiveProp(this)) + { + Pickup(); + } } else { @@ -255,6 +258,7 @@ item.Count += Count; Count = 0; } + Destroy(); } } } @@ -292,7 +296,6 @@ public override void OnPickUpItem() { - Pickup(); } public override void OnRemoveItem() diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index f910803..c2ce92b 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -81,6 +81,11 @@ /// [Export, ExportFillNode] public CollisionShape2D InteractiveCollision { get; set; } + + /// + /// 武器挂载点是否始终指向目标 + /// + public bool MountLookTarget { get; set; } = true; /// /// 脸的朝向 @@ -222,6 +227,18 @@ /// public ActivityObject InteractiveItem { get; private set; } + /// + /// 是否可以翻滚 + /// + public bool CanRoll => _rollCoolingTimer <= 0; + + /// + /// 是否处于近战攻击中 + /// + public bool IsMeleeAttack { get; private set; } + + //翻滚冷却计时器 + private float _rollCoolingTimer = 0; //初始缩放 private Vector2 _startScale; //所有角色碰撞的物体 @@ -383,6 +400,11 @@ protected override void Process(float delta) { + if (_rollCoolingTimer > 0) + { + _rollCoolingTimer -= delta; + } + //看向目标 if (LookTarget != null) { @@ -397,8 +419,12 @@ { Face = FaceDirection.Left; } - //枪口跟随目标 - MountPoint.SetLookAt(pos); + + if (MountLookTarget) + { + //枪口跟随目标 + MountPoint.SetLookAt(pos); + } } //检查可互动的物体 @@ -570,7 +596,6 @@ /// 使角色看向指定的坐标, /// 注意, 调用该函数会清空 LookTarget, 因为拥有 LookTarget 时也会每帧更新玩家视野位置 /// - /// public void LookTargetPosition(Vector2 pos) { LookTarget = null; @@ -584,8 +609,12 @@ { Face = FaceDirection.Left; } - //枪口跟随目标 - MountPoint.SetLookAt(pos); + + if (MountLookTarget) + { + //枪口跟随目标 + MountPoint.SetLookAt(pos); + } } /// @@ -854,13 +883,35 @@ /// public virtual void Attack() { - if (WeaponPack.ActiveItem != null) + if (!IsMeleeAttack && WeaponPack.ActiveItem != null) { WeaponPack.ActiveItem.Trigger(this); } } /// + /// 触发近战攻击 + /// + public virtual void MeleeAttack() + { + if (IsMeleeAttack) + { + return; + } + + if (WeaponPack.ActiveItem != null) + { + IsMeleeAttack = true; + WeaponPack.ActiveItem.TriggerMeleeAttack(this); + //播放近战动画 + PlayAnimation_MeleeAttack(() => + { + IsMeleeAttack = false; + }); + } + } + + /// /// 触发使用道具 /// public virtual void UseActiveProp() @@ -1028,4 +1079,12 @@ ActivePropsPack.Destroy(); WeaponPack.Destroy(); } + + /// + /// 翻滚结束 + /// + public void OverRoll() + { + _rollCoolingTimer = RoleState.RollTime; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs index 835d741..f1c0e91 100644 --- a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs @@ -15,16 +15,21 @@ /// 移动加速度 /// public float Acceleration = 1500f; - + + /// + /// 移动摩擦力, 仅用于人物基础移动 + /// + public float Friction = 900f; + /// /// 翻滚速度 /// public float RollSpeed = 180f; - + /// - /// 移动摩擦力 + /// 翻滚冷却时间 /// - public float Friction = 900f; + public float RollTime = 0.5f; /// /// 单格护盾恢复时间, 单位: 秒 @@ -39,7 +44,7 @@ /// /// 护盾被攻击后的无敌时间, 单位: 秒 /// - public float ShieldInvincibleTime = 0.5f; + public float ShieldInvincibleTime = 0.4f; /// /// 攻击/发射后计算伤害 diff --git a/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs new file mode 100644 index 0000000..fc3e853 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs @@ -0,0 +1,53 @@ + +using System; +using Godot; +using Vector2 = Godot.Vector2; + +public partial class Role +{ + /// + /// 播放近战攻击动画 + /// + public virtual void PlayAnimation_MeleeAttack(Action finish) + { + MountLookTarget = false; + var r = MountPoint.RotationDegrees; + var p1 = MountPoint.Position; + var p2 = p1 + new Vector2(6, 0).Rotated(Mathf.DegToRad(r - 60)); + var p3 = p1 + new Vector2(6, 0).Rotated(Mathf.DegToRad(r + 60)); + + var tween = CreateTween(); + tween.SetParallel(); + + tween.TweenProperty(MountPoint, "rotation_degrees", r - 60, 0.15); + tween.TweenProperty(MountPoint, "position", p2, 0.15); + tween.Chain(); + + tween.TweenCallback(Callable.From(() => + { + MountPoint.RotationDegrees = r + 60; + MountPoint.Position = p3; + //创建屏幕抖动 + if (Face == FaceDirection.Right) + { + GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(r - 90)) * 5); + } + else + { + GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(270 - r)) * 5); + } + })); + tween.Chain(); + + tween.TweenProperty(MountPoint, "rotation_degrees", r, 0.3); + tween.TweenProperty(MountPoint, "position", p1, 0.3); + tween.Chain(); + + tween.TweenCallback(Callable.From(() => + { + MountLookTarget = true; + finish(); + })); + tween.Play(); + } +} \ 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 89e806c..0227a42 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -84,8 +84,12 @@ { Face = FaceDirection.Left; } - //枪口跟随鼠标 - MountPoint.SetLookAt(mousePos); + + if (MountLookTarget) + { + //枪口跟随鼠标 + MountPoint.SetLookAt(mousePos); + } } if (InputManager.ExchangeWeapon) //切换武器 @@ -121,7 +125,14 @@ Reload(); } - if (InputManager.Fire) //开火 + if (InputManager.MeleeAttack) //近战攻击 + { + if (StateController.CurrState != PlayerStateEnum.Roll) //不能是翻滚状态 + { + MeleeAttack(); + } + } + else if (InputManager.Fire) //正常开火 { if (StateController.CurrState != PlayerStateEnum.Roll) //不能是翻滚状态 { diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs index fb3c530..be67372 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerIdleState.cs @@ -21,7 +21,7 @@ var dir = InputManager.MoveAxis; if (dir != Vector2.Zero) { - if (InputManager.Roll) //按下翻滚 + if (InputManager.Roll && Master.CanRoll) //按下翻滚 { ChangeState(PlayerStateEnum.Roll); } diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs index a3953f1..b234832 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerMoveState.cs @@ -24,7 +24,7 @@ } else { - if (InputManager.Roll) //翻滚 + if (InputManager.Roll && Master.CanRoll) //翻滚 { ChangeState(PlayerStateEnum.Roll); } diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs index badde0e..229b5df 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs @@ -54,6 +54,7 @@ { yield return Master.AnimatedSprite.ToSignal(Master.AnimatedSprite, AnimatedSprite2D.SignalName.AnimationFinished); _coroutineId = -1; + Master.OverRoll(); if (InputManager.MoveAxis != Vector2.Zero) //切换到移动状态 { ChangeState(PlayerStateEnum.Move); diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index f8d877d..5ec5fd3 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -981,6 +981,14 @@ } /// + /// 触发武器的近战攻击 + /// + public void TriggerMeleeAttack(Role trigger) + { + + } + + /// /// 获取武器攻击的目标层级 /// /// diff --git a/DungeonShooting_Godot/src/game/manager/InputManager.cs b/DungeonShooting_Godot/src/game/manager/InputManager.cs index 01512d6..6d92161 100644 --- a/DungeonShooting_Godot/src/game/manager/InputManager.cs +++ b/DungeonShooting_Godot/src/game/manager/InputManager.cs @@ -62,17 +62,17 @@ public static bool Fire { get; private set; } /// - /// 是否按钮近战攻击按钮 (使用远程武器发起的近战攻击), 键鼠: 鼠标右键 + /// 是否按钮近战攻击按钮 (使用远程武器发起的近战攻击), 键鼠: 键盘Space /// public static bool MeleeAttack { get; private set; } /// - /// 是否按下翻滚按钮, 键鼠: 键盘Space + /// 是否按下翻滚按钮, 键鼠: 鼠标右键 /// public static bool Roll { get; private set; } /// - /// 是否按下打开地图按钮, 键鼠: 键盘Ctrl + /// 是否按下打开地图按钮, 键鼠: 键盘Ctrl /// public static bool Map { get; private set; }