Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / ActivityMark.cs
@lijincheng lijincheng on 10 Mar 2023 2 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 _isStart = false;
  47. private float _timer = 0;
  48. private RoomInfo _tempRoom;
  49.  
  50. /// <summary>
  51. /// 获取物体Id
  52. /// </summary>
  53. public string GetItemId()
  54. {
  55. return ActivityIdPrefix.GetNameByPrefixType(Type) + ItemId;
  56. }
  57.  
  58. public override void _Process(double delta)
  59. {
  60. if (_isStart && DelayTime > 0)
  61. {
  62. _timer += (float)delta;
  63. if (_timer >= DelayTime)
  64. {
  65. Doing(_tempRoom);
  66. _tempRoom = null;
  67. _isStart = false;
  68. }
  69. }
  70. }
  71.  
  72. /// <summary>
  73. /// 标记准备好了
  74. /// </summary>
  75. public void BeReady(RoomInfo roomInfo)
  76. {
  77. _isStart = true;
  78. if (DelayTime <= 0)
  79. {
  80. Doing(roomInfo);
  81. _isStart = false;
  82. }
  83. else
  84. {
  85. _timer = 0;
  86. _tempRoom = roomInfo;
  87. }
  88. }
  89.  
  90. /// <summary>
  91. /// 是否已经结束
  92. /// </summary>
  93. public bool IsOver()
  94. {
  95. return !_isStart;
  96. }
  97.  
  98. /// <summary>
  99. /// 调用该函数表示该标记可以生成物体了, 使用标记创建实例必须调用 CreateInstance(id)
  100. /// </summary>
  101. public virtual void Doing(RoomInfo roomInfo)
  102. {
  103. CreateInstance<ActivityObject>(GetItemId());
  104. Visible = false;
  105. }
  106. /// <summary>
  107. /// 创建实例,并放入场景中,使用标记创建实例必须调用 CreateInstance(id)
  108. /// </summary>
  109. protected T CreateInstance<T>(string id) where T : ActivityObject
  110. {
  111. var instance = ActivityObject.Create<T>(id);
  112. instance.PutDown(GlobalPosition, Layer);
  113. if (instance is Enemy)
  114. {
  115. }
  116. return instance;
  117. }
  118. public override void _Draw()
  119. {
  120. if (Engine.IsEditorHint() || GameApplication.Instance.Debug)
  121. {
  122. DrawLine(new Vector2(-5, -5), new Vector2(5, 5), DrawColor, 2f);
  123. DrawLine(new Vector2(-5, 5), new Vector2(5, -5), DrawColor, 2f);
  124. }
  125. }
  126.  
  127. }