Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / bottomTips / BottomTipsPanel.cs
@lijincheng lijincheng on 21 Jul 2023 3 KB UiGrid 添加更多操作函数
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);
    }

    public override void OnShowUi()
    {

    }

    public override void OnHideUi()
    {
        
    }

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

    /// <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(Texture2D icon, string message)
    {
        //还原位置
        var pos = L_Panel.Instance.Position;
        pos.Y = Position.Y + Size.Y + _offsetY;
        L_Panel.Instance.Position = pos;
        
        SetIcon(icon);
        SetMessage(message);
        
        yield return 0;
        ShowUi();
        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 frame = 60 * _animationTime;
        var stepPixel = _movePixel / frame;
        for (var i = 0; i < frame; i++)
        {
            pos.X = L_Panel.Instance.Position.X;
            pos.Y -= stepPixel;
            L_Panel.Instance.Position = pos;
            yield return 0;
        }

        yield return new WaitForSeconds(3.5f);
        
        //向下移动
        for (var i = 0; i < frame; i++)
        {
            pos.X = L_Panel.Instance.Position.X;
            pos.Y += stepPixel;
            L_Panel.Instance.Position = pos;
            yield return 0;
        }

        HideUi();
        _id = -1;
    }
    
    private static BottomTipsPanel _instance;
    public static void Init()
    {
        _instance = UiManager.CreateUi<BottomTipsPanel>(UiManager.UiName.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);
    }
}