Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / common / AutoFreezeObject.cs
using Godot;

/// <summary>
/// 停止移动后自动冻结对象
/// </summary>
[Tool]
public partial class AutoFreezeObject : ActivityObject
{
    /// <summary>
    /// 自动播放的动画, 物体会等待该动画播完完成后进入冻结状态, 该动画不能是循环动画
    /// </summary>
    [Export]
    public string AnimationName { get; set; }
    
    /// <summary>
    /// 在冻结前是否变灰
    /// </summary>
    [Export]
    public bool AutoToGrey { get; set; }

    /// <summary>
    /// 冻结次数
    /// </summary>
    public int FreezeCount { get; private set; }
    
    private bool _playFlag = false;
    private float _grey = 0;

    /// <summary>
    /// 冻结时调用
    /// </summary>
    protected virtual void OnFreeze()
    {
    }
    
    public override void OnInit()
    {
        if (!string.IsNullOrEmpty(AnimationName))
        {
            _playFlag = true;
            AnimatedSprite.AnimationFinished += OnAnimationFinished;
            AnimatedSprite.Play(AnimationName);
        }
    }

    protected override void Process(float delta)
    {
        //落地静止后将弹壳变为静态贴图
        if (!_playFlag &&!IsThrowing && Altitude <= 0 && MoveController.IsMotionless())
        {
            if (AutoToGrey && _grey < 1)
            {
                //变灰动画时间, 0.5秒
                _grey = Mathf.Min(1, _grey + delta / 0.5f);
                Grey = _grey;
                return;
            }
            if (AffiliationArea != null)
            {
                OnFreeze();
                Freeze();
                FreezeCount++;
            }
            else
            {
                Debug.Log(Name + "投抛到画布外了, 强制消除...");
                Destroy();
            }
        }
    }

    private void OnAnimationFinished()
    {
        _playFlag = false;
    }
}