Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / role / enemy / state / AITailAfterState.cs

/// <summary>
/// AI 发现玩家
/// </summary>
public class AITailAfterState : IState<Enemy, AIStateEnum>
{
    public AIStateEnum StateType { get; } = AIStateEnum.AITailAfter;
    public Enemy Master { get; set; }
    public StateController<Enemy, AIStateEnum> StateController { get; set; }
    public void Enter(AIStateEnum prev, params object[] args)
    {
        //临时处理
        //Master.PathSign.Enable = true;
    }

    public void PhysicsProcess(float delta)
    {
        var master = Master;
        if (Master.PathSign.Enable)
        {
            var targetSign = master.PathSign;
            var enemyPos = master.GlobalPosition;
            if (targetSign.Next == null)
            {
                var targetPosition = targetSign.TargetPosition;

                if (enemyPos.DistanceSquaredTo(targetPosition) <=
                    master.Velocity.LengthSquared() * delta) //移动到下一个节点了, 还是没有找到目标, 变为第二状态
                {
                    StateController.ChangeStateLate(AIStateEnum.AINormal);
                }
                else //继续移动
                {
                    master.LookTargetPosition(targetPosition);
                    master.AnimatedSprite.Animation = AnimatorNames.Run;
                    master.Velocity = (targetPosition - enemyPos).Normalized() * master.MoveSpeed;
                    master.CalcMove(delta);
                }
            }
            else
            {
                var nextPos = targetSign.Next.GlobalPosition;

                if (enemyPos.DistanceSquaredTo(nextPos) <=
                    master.Velocity.LengthSquared() * delta) //已经移动到下一个节点了, 删除下一个节点, 后面的接上
                {
                    var nextNext = targetSign.Next.Next;
                    var tempPos = targetSign.Next.TargetPosition;
                    targetSign.Next.Next = null;
                    targetSign.Next.Destroy();
                    targetSign.Next = nextNext;

                    if (nextNext != null) //下一个点继续移动
                    {
                        nextPos = nextNext.GlobalPosition;
                        master.LookTargetPosition(nextPos);
                        master.AnimatedSprite.Animation = AnimatorNames.Run;
                        master.Velocity = (nextPos - enemyPos).Normalized() * master.MoveSpeed;
                        master.CalcMove(delta);
                    }
                    else
                    {
                        targetSign.TargetPosition = tempPos;
                    }
                }
                else //继续移动
                {
                    master.LookTargetPosition(nextPos);
                    master.AnimatedSprite.Animation = AnimatorNames.Run;
                    master.Velocity = (nextPos - enemyPos).Normalized() * master.MoveSpeed;
                    master.CalcMove(delta);
                }
            }
        }
    }

    public bool CanChangeState(AIStateEnum next)
    {
        return true;
    }

    public void Exit(AIStateEnum next)
    {
        
    }
}