Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / role / player / state / PlayerRollState.cs
@小李xl 小李xl on 23 Nov 2023 2 KB 添加敌人属性表

using System.Collections;
using Godot;

/// <summary>
/// 翻滚状态
/// </summary>
public class PlayerRollState : StateBase<Player, PlayerStateEnum>
{
    private long _coroutineId = -1;
    private Vector2 _moveDir;
    
    public PlayerRollState() : base(PlayerStateEnum.Roll)
    {
    }

    public override void Enter(PlayerStateEnum prev, params object[] args)
    {
        if (_coroutineId >= 0)
        {
            Master.StopCoroutine(_coroutineId);
        }

        _coroutineId = Master.StartCoroutine(RunRoll());

        // //隐藏武器
        // Master.BackMountPoint.Visible = false;
        // Master.MountPoint.Visible = false;
        //禁用伤害碰撞
        Master.HurtCollision.Disabled = true;
        
        //翻滚移动方向
        _moveDir = InputManager.MoveAxis;
        Master.BasisVelocity = _moveDir * Master.PlayerRoleState.RollSpeed;
    }

    public override void Exit(PlayerStateEnum next)
    {
        // //显示武器
        // Master.BackMountPoint.Visible = true;
        // Master.MountPoint.Visible = true;
        //启用伤害碰撞
        Master.HurtCollision.Disabled = false;
        Master.BasisVelocity = Master.BasisVelocity.LimitLength(Master.RoleState.MoveSpeed);
    }

    public override void Process(float delta)
    {
        Master.BasisVelocity = _moveDir * Master.PlayerRoleState.RollSpeed;
    }

    //翻滚逻辑处理
    private IEnumerator RunRoll()
    {
        Master.AnimationPlayer.Play(AnimatorNames.Roll);
        var time = 0f;
        var time2 = 0f;
        while (time < Master.PlayerRoleState.RollTime)
        {
            var delta = (float)Master.GetProcessDeltaTime();
            time += delta;
            time2 += delta;
            if (time2 >= 0.02f)
            {
                time2 %= 0.02f;
                //拖尾效果
                var staticSprite = ObjectManager.GetPoolItemByClass<SmearingSprite>();
                staticSprite.FromActivityObject(Master);
                staticSprite.SetShowTimeout(0.2f);
                staticSprite.ZIndex = 1;
                var roomLayer = Master.World.GetRoomLayer(RoomLayerEnum.NormalLayer);
                roomLayer.AddChild(staticSprite);
                //roomLayer.MoveChild(staticSprite, Master.GetIndex());
            }

            yield return null;
        }
        _coroutineId = -1;
        Master.OverRoll();
        if (InputManager.MoveAxis != Vector2.Zero) //切换到移动状态
        {
            ChangeState(PlayerStateEnum.Move);
        }
        else //切换空闲状态
        {
            ChangeState(PlayerStateEnum.Idle);
        }
    }
}