Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / role / enemy / state / AITailAfterState.cs
  1.  
  2. /// <summary>
  3. /// AI 发现玩家
  4. /// </summary>
  5. public class AITailAfterState : IState<Enemy, AIStateEnum>
  6. {
  7. public AIStateEnum StateType { get; } = AIStateEnum.AITailAfter;
  8. public Enemy Master { get; set; }
  9. public StateController<Enemy, AIStateEnum> StateController { get; set; }
  10. public void Enter(AIStateEnum prev, params object[] args)
  11. {
  12. //临时处理
  13. //Master.PathSign.Enable = true;
  14. }
  15.  
  16. public void PhysicsProcess(float delta)
  17. {
  18. var master = Master;
  19. if (Master.PathSign.Enable)
  20. {
  21. var targetSign = master.PathSign;
  22. var enemyPos = master.GlobalPosition;
  23. if (targetSign.Next == null)
  24. {
  25. var targetPosition = targetSign.TargetPosition;
  26.  
  27. if (enemyPos.DistanceSquaredTo(targetPosition) <=
  28. master.Velocity.LengthSquared() * delta) //移动到下一个节点了, 还是没有找到目标, 变为第二状态
  29. {
  30. StateController.ChangeStateLate(AIStateEnum.AINormal);
  31. }
  32. else //继续移动
  33. {
  34. master.LookTargetPosition(targetPosition);
  35. master.AnimatedSprite.Animation = AnimatorNames.Run;
  36. master.Velocity = (targetPosition - enemyPos).Normalized() * master.MoveSpeed;
  37. master.CalcMove(delta);
  38. }
  39. }
  40. else
  41. {
  42. var nextPos = targetSign.Next.GlobalPosition;
  43.  
  44. if (enemyPos.DistanceSquaredTo(nextPos) <=
  45. master.Velocity.LengthSquared() * delta) //已经移动到下一个节点了, 删除下一个节点, 后面的接上
  46. {
  47. var nextNext = targetSign.Next.Next;
  48. var tempPos = targetSign.Next.TargetPosition;
  49. targetSign.Next.Next = null;
  50. targetSign.Next.Destroy();
  51. targetSign.Next = nextNext;
  52.  
  53. if (nextNext != null) //下一个点继续移动
  54. {
  55. nextPos = nextNext.GlobalPosition;
  56. master.LookTargetPosition(nextPos);
  57. master.AnimatedSprite.Animation = AnimatorNames.Run;
  58. master.Velocity = (nextPos - enemyPos).Normalized() * master.MoveSpeed;
  59. master.CalcMove(delta);
  60. }
  61. else
  62. {
  63. targetSign.TargetPosition = tempPos;
  64. }
  65. }
  66. else //继续移动
  67. {
  68. master.LookTargetPosition(nextPos);
  69. master.AnimatedSprite.Animation = AnimatorNames.Run;
  70. master.Velocity = (nextPos - enemyPos).Normalized() * master.MoveSpeed;
  71. master.CalcMove(delta);
  72. }
  73. }
  74. }
  75. }
  76.  
  77. public bool CanChangeState(AIStateEnum next)
  78. {
  79. return true;
  80. }
  81.  
  82. public void Exit(AIStateEnum next)
  83. {
  84. }
  85. }