Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / bottomTips / BottomTipsPanel.cs
using System.Collections;
using Godot;

namespace UI.BottomTips;

/// <summary>
/// 底部提示面板
/// </summary>
public partial class BottomTipsPanel : BottomTips
{
    private long _id = -1;
    
    private float _offsetY;
    //动画播放时间
    private float _animationTime = 0.5f;
    //动画移动的像素
    private int _movePixel = 153;

    public override void OnCreateUi()
    {
        _offsetY = L_Panel.Instance.Position.Y - (Position.Y + Size.Y);
    }
    

    /// <summary>
    /// 执行入场流程
    /// </summary>
    public void PlayInStep(Texture2D icon, string message)
    {
        if (_id >= 0)
        {
            StopCoroutine(_id);
            HideUi();
        }
        SetIcon(icon);
        SetMessage(message);
        _id = StartCoroutine(RunAnimation());
        ShowUi();
    }

    /// <summary>
    /// 设置图标
    /// </summary>
    public void SetIcon(Texture2D icon)
    {
        S_TextureRect.Instance.Texture = icon;
    }
    
    /// <summary>
    /// 设置文本内容
    /// </summary>
    public void SetMessage(string message)
    {
        S_Label.Instance.Text = message;
    }

    private IEnumerator RunAnimation()
    {
        //还原位置
        var pos = L_Panel.Instance.Position;
        pos.Y = Position.Y + Size.Y + _offsetY;
        L_Panel.Instance.Position = pos;

        L_Panel.Instance.ResetSize();
        yield return 0;
        //重新计算中心点
        pos.X = Size.X / 2 - L_Panel.Instance.Size.X / 2;
        L_Panel.Instance.Position = pos;
        yield return 0;

        //向上移动
        var time = 0f;
        while (time < _animationTime)
        {
            L_Panel.Instance.Position = new Vector2(
                pos.X,
                pos.Y - Mathf.Lerp(0, _movePixel, Mathf.Min(time / _animationTime, 1))
            );
            time += (float)GetProcessDeltaTime();
            yield return 0;
        }

        yield return new WaitForSeconds(3.5f);
        
        //向下移动
        while (time > 0)
        {
            L_Panel.Instance.Position = new Vector2(
                pos.X,
                pos.Y - Mathf.Lerp(0, _movePixel, Mathf.Max(time / _animationTime, 0))
            );
            time -= (float)GetProcessDeltaTime();
            yield return 0;
        }

        HideUi();
        _id = -1;
    }
    
    private static BottomTipsPanel _instance;
    public static void Init()
    {
        _instance = UiManager.CreateUi<BottomTipsPanel>(UiManager.UiNames.BottomTips);
    }

    /// <summary>
    /// 打开Tips, 并设置图标和内容
    /// </summary>
    /// <param name="icon">显示图标</param>
    /// <param name="message">显示消息</param>
    public static void ShowTips(string icon, string message)
    {
        ShowTips(ResourceManager.Load<Texture2D>(icon), message);
    }

    /// <summary>
    /// 打开Tips, 并设置图标和内容
    /// </summary>
    /// <param name="icon">显示图标</param>
    /// <param name="message">显示消息</param>
    public static void ShowTips(Texture2D icon, string message)
    {
        _instance.PlayInStep(icon, message);
    }
}