Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / ActivityMark.cs
@lijincheng lijincheng on 11 Mar 2023 3 KB 优化 ActivityMark
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 物体生成标记
  6. /// </summary>
  7. [Tool]
  8. public partial class ActivityMark : Node2D
  9. {
  10. /// <summary>
  11. /// 物体类型
  12. /// </summary>
  13. [Export]
  14. public ActivityIdPrefix.ActivityPrefixType Type = ActivityIdPrefix.ActivityPrefixType.NonePrefix;
  15.  
  16. /// <summary>
  17. /// 物体id
  18. /// </summary>
  19. [Export]
  20. public string ItemId;
  21.  
  22. /// <summary>
  23. /// 所在层级
  24. /// </summary>
  25. [Export]
  26. public RoomLayerEnum Layer = RoomLayerEnum.NormalLayer;
  27.  
  28. /// <summary>
  29. /// 该标记在第几波调用 BeReady,
  30. /// 一个房间内所以敌人清完即可进入下一波
  31. /// </summary>
  32. [Export]
  33. public int WaveNumber = 1;
  34.  
  35. /// <summary>
  36. /// 延时执行时间,单位:秒
  37. /// </summary>
  38. [Export]
  39. public float DelayTime = 0;
  40. /// <summary>
  41. /// 绘制的颜色
  42. /// </summary>
  43. protected Color DrawColor = new Color(0.4F, 0.56078434F, 0.8784314F);
  44.  
  45. //是否已经结束
  46. private bool _isOver = true;
  47. private float _overTimer = 0;
  48. private float _timer = 0;
  49. private RoomInfo _tempRoom;
  50.  
  51. /// <summary>
  52. /// 获取物体Id
  53. /// </summary>
  54. public string GetItemId()
  55. {
  56. return ActivityIdPrefix.GetNameByPrefixType(Type) + ItemId;
  57. }
  58.  
  59. public override void _Process(double delta)
  60. {
  61. if (_isOver)
  62. {
  63. _overTimer += (float)delta;
  64. if (_overTimer >= 1)
  65. {
  66. SetActive(false);
  67. }
  68. }
  69. else
  70. {
  71. if (DelayTime > 0)
  72. {
  73. _timer += (float)delta;
  74. if (_timer >= DelayTime)
  75. {
  76. Doing(_tempRoom);
  77. _tempRoom = null;
  78. _isOver = true;
  79. }
  80. }
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 标记准备好了
  86. /// </summary>
  87. public void BeReady(RoomInfo roomInfo)
  88. {
  89. _isOver = false;
  90. _overTimer = 0;
  91. SetActive(true);
  92. if (DelayTime <= 0)
  93. {
  94. Doing(roomInfo);
  95. _isOver = true;
  96. }
  97. else
  98. {
  99. _timer = 0;
  100. _tempRoom = roomInfo;
  101. }
  102. }
  103.  
  104. /// <summary>
  105. /// 是否已经结束
  106. /// </summary>
  107. public bool IsOver()
  108. {
  109. return _isOver && _overTimer >= 1;
  110. }
  111.  
  112. /// <summary>
  113. /// 调用该函数表示该标记可以生成物体了
  114. /// </summary>
  115. public virtual void Doing(RoomInfo roomInfo)
  116. {
  117. var instance = ActivityObject.Create(GetItemId());
  118. instance.PutDown(GlobalPosition, Layer);
  119. }
  120.  
  121. public override void _Draw()
  122. {
  123. if (Engine.IsEditorHint() || GameApplication.Instance.Debug)
  124. {
  125. DrawLine(new Vector2(-5, -5), new Vector2(5, 5), DrawColor, 2f);
  126. DrawLine(new Vector2(-5, 5), new Vector2(5, -5), DrawColor, 2f);
  127. }
  128. }
  129.  
  130. /// <summary>
  131. /// 设置当前节点是否是活动状态
  132. /// </summary>
  133. public void SetActive(bool flag)
  134. {
  135. SetProcess(flag);
  136. SetProcessInternal(flag);
  137. SetPhysicsProcess(flag);
  138. SetPhysicsProcessInternal(flag);
  139. }
  140. }