Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / components / StateBase.cs
@小李xl 小李xl on 28 Dec 2022 2 KB 地牢生成功能, 开发中...
  1. using System;
  2.  
  3. /// <summary>
  4. /// 状态基类
  5. /// </summary>
  6. public abstract class StateBase<T, S> where T : ActivityObject where S : Enum
  7. {
  8. /// <summary>
  9. /// 当前活跃的状态对象实例
  10. /// </summary>
  11. public StateBase<T, S> CurrStateBase => StateController.CurrStateBase;
  12. /// <summary>
  13. /// 当前对象对应的状态枚举
  14. /// </summary>
  15. public S State { get; }
  16.  
  17. /// <summary>
  18. /// 当前状态对象挂载的角色对象
  19. /// </summary>
  20. public T Master { get; set; }
  21.  
  22. /// <summary>
  23. /// 当前状态对象所处的状态机对象
  24. /// </summary>
  25. public StateController<T, S> StateController { get; set; }
  26.  
  27. public StateBase(S state)
  28. {
  29. State = state;
  30. }
  31. /// <summary>
  32. /// 当从其他状态进入到当前状态时调用
  33. /// </summary>
  34. /// <param name="prev">上一个状态类型</param>
  35. /// <param name="args">切换当前状态时附带的参数</param>
  36. public virtual void Enter(S prev, params object[] args)
  37. {
  38. }
  39.  
  40. /// <summary>
  41. /// 如果当前状态已被激活, 物理帧每帧更新
  42. /// </summary>
  43. public virtual void PhysicsProcess(float delta)
  44. {
  45. }
  46.  
  47. /// <summary>
  48. /// 是否允许切换至下一个状态, 该函数由状态机控制器调用, 不需要手动调用
  49. /// </summary>
  50. /// <param name="next">下一个状态类型</param>
  51. public virtual bool CanChangeState(S next)
  52. {
  53. return true;
  54. }
  55.  
  56. /// <summary>
  57. /// 从当前状态退出时调用
  58. /// </summary>
  59. /// <param name="next">下一个状态类型</param>
  60. public virtual void Exit(S next)
  61. {
  62. }
  63. /// <summary>
  64. /// 当启用 debug 后调用该函数, 调试绘制, 需要调用 Master 身上的绘制函数
  65. /// </summary>
  66. public virtual void DebugDraw()
  67. {
  68. }
  69.  
  70. /// <summary>
  71. /// 立即切换到下一个指定状态, 并且这一帧会被调用 PhysicsProcess
  72. /// </summary>
  73. public void ChangeState(S next, params object[] args)
  74. {
  75. StateController.ChangeState(next, args);
  76. }
  77. /// <summary>
  78. /// 切换到下一个指定状态, 下一帧才会调用 PhysicsProcess
  79. /// </summary>
  80. public void ChangeStateLate(S next, params object[] args)
  81. {
  82. StateController.ChangeStateLate(next, args);
  83. }
  84. }