Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / ActivityMark.cs
@lijincheng lijincheng on 10 Mar 2023 2 KB ActivityMark 延时执行

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);
        }
    }

}