Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / role / enemy / state / AITailAfterState.cs
@小李xl 小李xl on 21 Nov 2022 2 KB 敌人跟随玩家样例

/// <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)
    {
        return;
        var master = Master;
        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)
    {
        
    }
}