Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / activity / Component.cs
@小李xl 小李xl on 11 Sep 2023 5 KB 添加翻滚动作
  1.  
  2. using System.Collections;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 组件基类, 用于挂载到游戏物体上, 相比于原生 Node 更加轻量化, 实例化 Component 不会创建额外的 Node, 可以大量添加组件
  7. /// </summary>
  8. public abstract class Component : IProcess, IDestroy, ICoroutine
  9. {
  10. /// <summary>
  11. /// 当前组件所挂载的游戏对象
  12. /// </summary>
  13. public ActivityObject ActivityInstance { get; internal set; }
  14.  
  15. /// <summary>
  16. /// 当前组件所挂载的物体的坐标
  17. /// </summary>
  18. public Vector2 Position
  19. {
  20. get => ActivityInstance.Position;
  21. set => ActivityInstance.Position = value;
  22. }
  23.  
  24. /// <summary>
  25. /// 当前组件所挂载物体的全局坐标
  26. /// </summary>
  27. public Vector2 GlobalPosition
  28. {
  29. get => ActivityInstance.GlobalPosition;
  30. set => ActivityInstance.GlobalPosition = value;
  31. }
  32.  
  33. /// <summary>
  34. /// 当前组件所挂载物体的缩放
  35. /// </summary>
  36. public Vector2 Scale
  37. {
  38. get => ActivityInstance.Scale;
  39. set => ActivityInstance.Scale = value;
  40. }
  41. /// <summary>
  42. /// 当前组件所挂载物体的全局缩放
  43. /// </summary>
  44. public Vector2 GlobalScale
  45. {
  46. get => ActivityInstance.GlobalScale;
  47. set => ActivityInstance.GlobalScale = value;
  48. }
  49.  
  50. /// <summary>
  51. /// 当前组件所挂载物体的旋转角度
  52. /// </summary>
  53. public float Rotation
  54. {
  55. get => ActivityInstance.Rotation;
  56. set => ActivityInstance.Rotation = value;
  57. }
  58. /// <summary>
  59. /// 当前组件所挂载物体的全局旋转角度
  60. /// </summary>
  61. public float GlobalRotation
  62. {
  63. get => ActivityInstance.GlobalRotation;
  64. set => ActivityInstance.GlobalRotation = value;
  65. }
  66.  
  67. /// <summary>
  68. /// 当前组件所挂载物体的角度制旋转角度
  69. /// </summary>
  70. public float RotationDegrees
  71. {
  72. get => ActivityInstance.RotationDegrees;
  73. set => ActivityInstance.RotationDegrees = value;
  74. }
  75. /// <summary>
  76. /// 当前组件所挂载物体的全局角度制旋转角度
  77. /// </summary>
  78. public float GlobalRotationDegrees
  79. {
  80. get => ActivityInstance.GlobalRotationDegrees;
  81. set => ActivityInstance.GlobalRotationDegrees = value;
  82. }
  83. /// <summary>
  84. /// 当前组件所挂载物体的ZIndex
  85. /// </summary>
  86. public int ZIndex
  87. {
  88. get => ActivityInstance.ZIndex;
  89. set => ActivityInstance.ZIndex = value;
  90. }
  91. /// <summary>
  92. /// 当前组件是否显示
  93. /// </summary>
  94. public bool Visible
  95. {
  96. get => ActivityInstance.Visible;
  97. set => ActivityInstance.Visible = value;
  98. }
  99.  
  100. /// <summary>
  101. /// 挂载物体的动画节点
  102. /// </summary>
  103. public AnimatedSprite2D AnimatedSprite2D => ActivityInstance.AnimatedSprite;
  104. /// <summary>
  105. /// 挂载物体的阴影节点
  106. /// </summary>
  107. public Sprite2D ShadowSprite => ActivityInstance.ShadowSprite;
  108. /// <summary>
  109. /// 挂载物体的碰撞器节点
  110. /// </summary>
  111. public CollisionShape2D Collision => ActivityInstance.Collision;
  112.  
  113. /// <summary>
  114. /// 是否启用当前组件, 如果禁用, 则不会调用 Process 和 PhysicsProcess
  115. /// </summary>
  116. public bool Enable
  117. {
  118. get => _enable;
  119. set
  120. {
  121. if (!_enable && value)
  122. {
  123. OnEnable();
  124. }
  125. else if (_enable && !value)
  126. {
  127. OnDisable();
  128. }
  129.  
  130. _enable = value;
  131. }
  132. }
  133.  
  134. private bool _enable = true;
  135.  
  136. /// <summary>
  137. /// 是否被销毁
  138. /// </summary>
  139. public bool IsDestroyed { get; private set; }
  140.  
  141. /// <summary>
  142. /// 是否调用过 Ready 函数
  143. /// </summary>
  144. public bool IsReady { get; set; }
  145.  
  146. /// <summary>
  147. /// 第一次调用 Process 或 PhysicsProcess 之前调用
  148. /// </summary>
  149. public virtual void Ready()
  150. {
  151. }
  152.  
  153. /// <summary>
  154. /// 如果启用了组件, 则每帧会调用一次 Process
  155. /// </summary>
  156. /// <param name="delta"></param>
  157. public virtual void Process(float delta)
  158. {
  159. }
  160.  
  161. /// <summary>
  162. /// 如果启用了组件, 则每物理帧会调用一次 PhysicsProcess
  163. /// </summary>
  164. /// <param name="delta"></param>
  165. public virtual void PhysicsProcess(float delta)
  166. {
  167. }
  168.  
  169. /// <summary>
  170. /// 当组件被销毁时调用
  171. /// </summary>
  172. public virtual void OnDestroy()
  173. {
  174. }
  175.  
  176. /// <summary>
  177. /// 当组件启用时调用
  178. /// </summary>
  179. public virtual void OnEnable()
  180. {
  181. }
  182.  
  183. /// <summary>
  184. /// 当组件禁用时调用
  185. /// </summary>
  186. public virtual void OnDisable()
  187. {
  188. }
  189.  
  190. /// <summary>
  191. /// 如果开启 debug, 则每帧调用该函数, 可用于绘制文字线段等, 需要调用 ActivityInstance 身上的绘制函数
  192. /// </summary>
  193. public virtual void DebugDraw()
  194. {
  195. }
  196.  
  197. /// <summary>
  198. /// 当组件销毁
  199. /// </summary>
  200. public void Destroy()
  201. {
  202. if (IsDestroyed)
  203. {
  204. return;
  205. }
  206.  
  207. IsDestroyed = true;
  208. ActivityInstance.RemoveComponent(this);
  209. OnDestroy();
  210. }
  211.  
  212. public long StartCoroutine(IEnumerator able)
  213. {
  214. return ActivityInstance.StartCoroutine(able);
  215. }
  216.  
  217. public void StopCoroutine(long coroutineId)
  218. {
  219. ActivityInstance.StopCoroutine(coroutineId);
  220. }
  221.  
  222. public bool IsCoroutineOver(long coroutineId)
  223. {
  224. return ActivityInstance.IsCoroutineOver(coroutineId);
  225. }
  226.  
  227. public void StopAllCoroutine()
  228. {
  229. ActivityInstance.StopAllCoroutine();
  230. }
  231. }