-
- /// <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)
- {
-
- }
- }