Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / ActivityMark.cs
@lijincheng lijincheng on 24 Apr 2023 7 KB 小修改
  1.  
  2. using System.Collections;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 物体生成标记
  7. /// </summary>
  8. [Tool]
  9. public partial class ActivityMark : Node2D
  10. {
  11. /// <summary>
  12. /// 物体类型
  13. /// </summary>
  14. [Export]
  15. public ActivityIdPrefix.ActivityPrefixType Type = ActivityIdPrefix.ActivityPrefixType.NonePrefix;
  16.  
  17. /// <summary>
  18. /// 物体id
  19. /// </summary>
  20. [Export]
  21. public string ItemId;
  22.  
  23. /// <summary>
  24. /// 所在层级
  25. /// </summary>
  26. [Export]
  27. public RoomLayerEnum Layer = RoomLayerEnum.NormalLayer;
  28.  
  29. /// <summary>
  30. /// 该标记在第几波调用 BeReady,
  31. /// 一个房间内所以敌人清完即可进入下一波
  32. /// </summary>
  33. [Export]
  34. public int WaveNumber = 1;
  35.  
  36. /// <summary>
  37. /// 延时执行时间,单位:秒
  38. /// </summary>
  39. [Export]
  40. public float DelayTime = 0;
  41.  
  42. /// <summary>
  43. /// 物体会在该矩形区域内随机位置生成
  44. /// </summary>
  45. [Export]
  46. public Vector2I BirthRect = Vector2I.Zero;
  47. /// <summary>
  48. /// 绘制的颜色
  49. /// </summary>
  50. [Export]
  51. public Color DrawColor = new Color(1, 1, 1, 1);
  52.  
  53. /// <summary>
  54. /// 物体初始海拔高度
  55. /// </summary>
  56. [ExportGroup("Vertical")]
  57. [Export(PropertyHint.Range, "0, 128")]
  58. public int Altitude = 0;
  59.  
  60. /// <summary>
  61. /// 物体初始纵轴速度
  62. /// </summary>
  63. [Export(PropertyHint.Range, "-1000,1000,0.1")]
  64. public float VerticalSpeed = 0;
  65.  
  66. /// <summary>
  67. /// 当前标记所在Tile节点
  68. /// </summary>
  69. public TileMap TileRoot;
  70.  
  71. //是否已经结束
  72. private bool _isOver = true;
  73. private float _overTimer = 0;
  74. private float _timer = 0;
  75. private RoomInfo _tempRoom;
  76.  
  77. //绘制的字体
  78. private static Font _drawFont;
  79. /// <summary>
  80. /// 获取物体Id
  81. /// </summary>
  82. public string GetItemId()
  83. {
  84. return ActivityIdPrefix.GetNameByPrefixType(Type) + ItemId;
  85. }
  86.  
  87. public override void _Process(double delta)
  88. {
  89. #if TOOLS
  90. if (Engine.IsEditorHint())
  91. {
  92. QueueRedraw();
  93. return;
  94. }
  95. #endif
  96. if (_isOver)
  97. {
  98. _overTimer += (float)delta;
  99. if (_overTimer >= 1)
  100. {
  101. SetActive(false);
  102. }
  103. }
  104. else
  105. {
  106. if (DelayTime > 0)
  107. {
  108. _timer += (float)delta;
  109. if (_timer >= DelayTime)
  110. {
  111. Doing(_tempRoom);
  112. _tempRoom = null;
  113. _isOver = true;
  114. }
  115. }
  116. }
  117. }
  118.  
  119. /// <summary>
  120. /// 进行预处理操作
  121. /// </summary>
  122. public void Pretreatment()
  123. {
  124. }
  125.  
  126. /// <summary>
  127. /// 标记准备好了
  128. /// </summary>
  129. public void BeReady(RoomInfo roomInfo)
  130. {
  131. _isOver = false;
  132. _overTimer = 0;
  133. SetActive(true);
  134. if (DelayTime <= 0)
  135. {
  136. Doing(roomInfo);
  137. _isOver = true;
  138. }
  139. else
  140. {
  141. _timer = 0;
  142. _tempRoom = roomInfo;
  143. }
  144. }
  145.  
  146. /// <summary>
  147. /// 是否已经结束
  148. /// </summary>
  149. public bool IsOver()
  150. {
  151. return _isOver && _overTimer >= 1;
  152. }
  153.  
  154. /// <summary>
  155. /// 调用该函数表示该标记可以生成物体了
  156. /// </summary>
  157. public virtual void Doing(RoomInfo roomInfo)
  158. {
  159. CreateActivityObject().PutDown(Layer);
  160. }
  161.  
  162. /// <summary>
  163. /// 实例化ItemId指定的物体, 并返回对象实例, 函数会自动设置位置
  164. /// </summary>
  165. protected ActivityObject CreateActivityObject()
  166. {
  167. var instance = ActivityObject.Create(GetItemId());
  168. var pos = Position;
  169. if (BirthRect != Vector2I.Zero)
  170. {
  171. instance.Position = new Vector2(
  172. Utils.RandomRangeInt((int)pos.X - BirthRect.X / 2, (int)pos.X + BirthRect.X / 2),
  173. Utils.RandomRangeInt((int)pos.Y - BirthRect.Y / 2, (int)pos.Y + BirthRect.Y / 2)
  174. );
  175. }
  176. else
  177. {
  178. instance.Position = pos;
  179. }
  180. instance.VerticalSpeed = VerticalSpeed;
  181. instance.Altitude = Altitude;
  182. instance.StartCoroutine(OnActivityObjectBirth(instance));
  183. return instance;
  184. }
  185. /// <summary>
  186. /// 生成 ActivityObject 时调用, 用于出生时的动画效果
  187. /// </summary>
  188. protected virtual IEnumerator OnActivityObjectBirth(ActivityObject instance)
  189. {
  190. var a = 1.0f;
  191. instance.SetBlendColor(Colors.White);
  192. //禁用自定义行为
  193. instance.EnableCustomBehavior = false;
  194. //禁用下坠
  195. instance.EnableVerticalMotion = false;
  196.  
  197. for (var i = 0; i < 10; i++)
  198. {
  199. instance.SetBlendSchedule(a);
  200. yield return 0;
  201. }
  202. while (a > 0)
  203. {
  204. instance.SetBlendSchedule(a);
  205. a -= 0.05f;
  206. yield return 0;
  207. }
  208. //启用自定义行为
  209. instance.EnableCustomBehavior = true;
  210. //启用下坠
  211. instance.EnableVerticalMotion = true;
  212. }
  213.  
  214. #if TOOLS
  215. public override void _Draw()
  216. {
  217. if (Engine.IsEditorHint() || GameApplication.Instance.Debug)
  218. {
  219. var drawColor = DrawColor;
  220.  
  221. //如果在编辑器中选中了该节点, 则绘更改绘制颜色的透明度
  222. var selectedNodes = Plugin.Plugin.Instance?.GetEditorInterface()?.GetSelection()?.GetSelectedNodes();
  223. if (selectedNodes != null && selectedNodes.Contains(this))
  224. {
  225. drawColor.A = 1f;
  226. }
  227. else
  228. {
  229. drawColor.A = 0.5f;
  230. }
  231. DrawLine(new Vector2(-2, -2), new Vector2(2, 2), drawColor, 1f);
  232. DrawLine(new Vector2(-2, 2), new Vector2(2, -2), drawColor, 1f);
  233.  
  234. if (BirthRect != Vector2.Zero)
  235. {
  236. DrawRect(new Rect2(-BirthRect / 2, BirthRect), drawColor, false, 0.5f);
  237. }
  238.  
  239. if (_drawFont == null)
  240. {
  241. _drawFont = ResourceManager.Load<Font>(ResourcePath.Silver_ttf);
  242. }
  243. DrawString(_drawFont, new Vector2(-14, 12), WaveNumber.ToString(), HorizontalAlignment.Center, 28, 14);
  244. }
  245. }
  246. #endif
  247.  
  248. /// <summary>
  249. /// 设置当前节点是否是活动状态
  250. /// </summary>
  251. public void SetActive(bool flag)
  252. {
  253. // SetProcess(flag);
  254. // SetPhysicsProcess(flag);
  255. // SetProcessInput(flag);
  256. // Visible = flag;
  257. var parent = GetParent();
  258. if (flag)
  259. {
  260. if (parent == null)
  261. {
  262. TileRoot.AddChild(this);
  263. }
  264. else if (parent != TileRoot)
  265. {
  266. parent.RemoveChild(this);
  267. TileRoot.AddChild(this);
  268. }
  269. Owner = TileRoot;
  270. }
  271. else
  272. {
  273. if (parent != null)
  274. {
  275. parent.RemoveChild(this);
  276. Owner = null;
  277. }
  278. }
  279. }
  280. }