using Godot; /// <summary> /// 物体生成标记 /// </summary> [Tool] public partial class ActivityMark : Node2D { /// <summary> /// 物体类型 /// </summary> [Export] public ActivityIdPrefix.ActivityPrefixType Type = ActivityIdPrefix.ActivityPrefixType.NonePrefix; /// <summary> /// 物体id /// </summary> [Export] public string ItemId; /// <summary> /// 所在层级 /// </summary> [Export] public RoomLayerEnum Layer = RoomLayerEnum.NormalLayer; /// <summary> /// 该标记在第几波调用 BeReady, /// 一个房间内所以敌人清完即可进入下一波 /// </summary> [Export] public int WaveNumber = 1; /// <summary> /// 延时执行时间,单位:秒 /// </summary> [Export] public float DelayTime = 0; /// <summary> /// 绘制的颜色 /// </summary> protected Color DrawColor = new Color(0.4F, 0.56078434F, 0.8784314F); //是否已经开始 private bool _isStart = false; private float _timer = 0; private RoomInfo _tempRoom; /// <summary> /// 获取物体Id /// </summary> public string GetItemId() { return ActivityIdPrefix.GetNameByPrefixType(Type) + ItemId; } public override void _Process(double delta) { if (_isStart && DelayTime > 0) { _timer += (float)delta; if (_timer >= DelayTime) { Doing(_tempRoom); _tempRoom = null; _isStart = false; } } } /// <summary> /// 标记准备好了 /// </summary> public void BeReady(RoomInfo roomInfo) { _isStart = true; if (DelayTime <= 0) { Doing(roomInfo); _isStart = false; } else { _timer = 0; _tempRoom = roomInfo; } } /// <summary> /// 是否已经结束 /// </summary> public bool IsOver() { return !_isStart; } /// <summary> /// 调用该函数表示该标记可以生成物体了, 使用标记创建实例必须调用 CreateInstance(id) /// </summary> public virtual void Doing(RoomInfo roomInfo) { CreateInstance<ActivityObject>(GetItemId()); Visible = false; } /// <summary> /// 创建实例,并放入场景中,使用标记创建实例必须调用 CreateInstance(id) /// </summary> protected T CreateInstance<T>(string id) where T : ActivityObject { var instance = ActivityObject.Create<T>(id); instance.PutDown(GlobalPosition, Layer); if (instance is Enemy) { } return instance; } public override void _Draw() { if (Engine.IsEditorHint() || GameApplication.Instance.Debug) { DrawLine(new Vector2(-5, -5), new Vector2(5, 5), DrawColor, 2f); DrawLine(new Vector2(-5, 5), new Vector2(5, -5), DrawColor, 2f); } } }