UI界面切换框架

这个框架是基于Siki之前的UI框架进行修改的。在之前框架的基础上,进行了一些个人的修改和扩展。
下面是这个框架的架构:
这里写图片描述
修改的地方:
1 首先是扩展:
原框架:
原框架是通过一个BasePanel类做基类进行扩展,想要自定义一个面板类,就要继承BasePanel。
修改后:
将BasePanel替换为一个IPanel接口,节省出继承基类的空间,而且如果有一些不方便再继承BasePanel的情况下,

public interface IPanel {
    int ID { get; }
    void OnEnter();
    void OnExit();
    void OnPause();
    void OnResume();
}

2 UIManager
修改前:UIManager具有生成和存储面板prefab,PushPanel()、PopPanel()等一系列作用
修改后:单独扩展一个PanelPool类,用于生成和存储面板Prefab,对外只开放PushPanel()和PopPanel()两个方法。UIManager则主要负责与外界进行交互。

public class UIManager {
    private static UIManager _instance;    //单例模式
    public static UIManager Instance {
        get {
            if (_instance == null) {
                _instance = new UIManager();
            }
            return _instance;
        }
    }

    PanelPool panelPool;

    private UIManager() {
        panelPool = new PanelPool("Json/JsonInfo", GameObject.Find("Canvas").transform);
    }

    public void PushPanel(int PanelID) {
        panelPool.PushPanel(PanelID);
    }

    public void PopPanel() {
        panelPool.PopPanel();
    }

    public void BackToMainMenu() {
        while (panelPool.Peek().ID != 0) {
            PopPanel();
        }
    }

    public void ReplayGame() {
        BackToMainMenu();
        PushPanel(1);
    }
}

增加一个面板存储池类

public class PanelPool {

    private UIPanelInfo _panelList;
    //根据Panel的ID进行存储
    private Dictionary<int, string> _panelPathDict;
    private Dictionary<int, IPanel> _panelTypeByID;
    private Stack<IPanel> _panelStack;

    private Transform _rootTransform;

    public PanelPool(string jsonPath, Transform rootTransfrom) {
        _rootTransform = rootTransfrom;
        JsonToObject(jsonPath);
        DictAddItem();
    }

    //Json文件转对象
    private void JsonToObject(string path) {
        _panelList = JsonReader.GetJsonObjectFromPath<UIPanelInfo>(path);
    }

    // 给存储路径的字典添加选项
    private void DictAddItem() {
        if (_panelPathDict == null) _panelPathDict = new Dictionary<int, string>();
        for (int i = 0; i < _panelList.InfoList.Length; i++) {
            string PanelPathStr;
            PanelPathStr = _panelList.InfoList[i].PanelPath;
            _panelPathDict.Add(_panelList.InfoList[i].ID, PanelPathStr);
        }
    }

    public void PushPanel(int panelID) {
        if (_panelStack == null) {
            _panelStack = new Stack<IPanel>();
        }
        if (_panelStack.Count > 0) {
            IPanel topPanel = _panelStack.Peek();
            topPanel.OnPause();
        }
        IPanel panelToPush = GetPanel(panelID);
        panelToPush.OnEnter();
        _panelStack.Push(panelToPush);
    }

    public void PopPanel() {
        if (_panelStack == null) {
            _panelStack = new Stack<IPanel>();
        }
        if (_panelStack.Count <= 0) return;
        IPanel topPanel = _panelStack.Pop();
        topPanel.OnExit();
        if (_panelStack.Count <= 0) return;
        IPanel topPanel2 = _panelStack.Peek();
        topPanel2.OnResume();
    }

    public IPanel Peek() {
        if (_panelStack == null) {
            return null;
        }
        return _panelStack.Peek();
    }

    private IPanel GetPanel(int panelID) {
        if (_panelTypeByID == null) {
            _panelTypeByID = new Dictionary<int, IPanel>();
        }
        IPanel panel = _panelTypeByID.TryGet(panelID);
        if (panel == null) {
            string pathstr = _panelPathDict.TryGet(panelID);
            GameObject instPanel = GameObject.Instantiate(Resources.Load(pathstr)) as GameObject;
            instPanel.transform.SetParent(_rootTransform, false);
            _panelTypeByID.Add(panelID, instPanel.GetComponent<IPanel>());
            return instPanel.GetComponent<IPanel>();
        }
        else {
            return panel;
        }
    }
}

3 扩展一个IPanel

public class BeginPanel : MonoBehaviour, IPanel {
    //Sound按钮是否启用
    bool isBTSoundActive = true;

    //Button列表
    Button bt_Play;
    Button bt_Rate;
    Button bt_Sound;
    Button bt_Rank;
    Button bt_Shop;
    Button bt_ADS;
    Button bt_Info;
    Button bt_Quit;

    //金币(只显示金币数量)
    Text txt_Coin;

    Image img_Sound;

    //设置PanelId
    private int _id = -1;
    int IPanel.ID {
        get {
            if (_id == -1) {
                _id = 0;
            }
            return _id;
        }
    }

    private void Awake() {
        bt_Play = transform.Find("BT_Play").GetComponent<Button>();
        bt_Play.onClick.AddListener(OnPlayBTClick);

        bt_Rate = transform.Find("BT_Rate").GetComponent<Button>();
        bt_Rate.onClick.AddListener(OnRateBTClick);
        bt_Sound = transform.Find("BT_Sound").GetComponent<Button>();
        bt_Sound.onClick.AddListener(OnSoundBTClick);
        bt_Rank = transform.Find("BT_Rank").GetComponent<Button>();
        bt_Rank.onClick.AddListener(OnRankBTClick);
        bt_Shop = transform.Find("BT_Shop").GetComponent<Button>();
        bt_Shop.onClick.AddListener(OnShopBTClick);
        bt_ADS = transform.Find("BT_ADS").GetComponent<Button>();
        bt_ADS.onClick.AddListener(OnADSBTClick);
        bt_Info = transform.Find("BT_Info").GetComponent<Button>();
        bt_Info.onClick.AddListener(OnInfoBTClick);
        bt_Quit = transform.Find("BT_Quit").GetComponent<Button>();
        bt_Quit.onClick.AddListener(OnQuitBTClick);

        txt_Coin = transform.Find("Txt_Coin").GetComponent<Text>();
        txt_Coin.text = PlayerData.Instance.GetCoin().ToString();


        img_Sound = transform.Find("BT_Sound").GetComponent<Image>();
    }




    //Button 监听事件
    void OnPlayBTClick() {
        UIManager.Instance.PushPanel(1);
        AudioEventsHandler.Instance.ButtonClick();
    }

    void OnRateBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
    }
    void OnSoundBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
        if (isBTSoundActive) {
            AudioEventsHandler.Instance.Mute();
            img_Sound.sprite = SpriteManager.Instance.GetSprite(SpriteType.SOUND_OFF);
            isBTSoundActive = false;
        }
        else {
            AudioEventsHandler.Instance.Demute();
            isBTSoundActive = true;
            img_Sound.sprite = SpriteManager.Instance.GetSprite(SpriteType.SOUND_ON);
        }

    }
    void OnRankBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
    }
    void OnShopBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
    }
    void OnADSBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
    }
    void OnInfoBTClick() {
        AudioEventsHandler.Instance.ButtonClick();
    }
    void OnQuitBTClick() {
        PlayerData.Instance.SaveData();
        Application.Quit();
    }

    void IPanel.OnEnter() {
        gameObject.SetActive(true);
    }

    void IPanel.OnExit() {
        gameObject.SetActive(false);
    }

    void IPanel.OnPause() {
    }

    void IPanel.OnResume() {
        txt_Coin.text = PlayerData.Instance.GetCoin().ToString();
    }
}
Qt是一个跨平台的C++应用程序开发框架,可以用于快速、高效地开发GUI界面。在Qt中,可以通过多种方式实现多个UI界面切换。 一种常用的方式是使用QStackedWidget控件。QStackedWidget是一个堆叠窗口容器,可以在其中放置多个UI界面,通过setCurrentIndex函数可以切换不同的界面。首先,需要在Qt Designer中设计好每个UI界面,然后在代码中创建对应的窗口对象,并将其添加到QStackedWidget控件中。当需要切换到另一个界面时,可以调用setCurrentIndex函数设置当前界面的索引值,从而实现界面的切换。 另一种方式是使用QTabWidget控件。QTabWidget是一个选项卡窗口容器,可以通过选项卡来切换不同的UI界面。类似于QStackedWidget,首先需要在Qt Designer中设计好每个UI界面,并在代码中创建对应的窗口对象。然后,将这些窗口对象添加到QTabWidget控件中,并设置对应的选项卡标题。通过切换选项卡,即可实现不同界面的切换。 此外,还可以使用QMainWindow作为主窗口,通过在其中添加不同的子窗口对象来实现界面的切换。在需要切换界面时,可以使用setCentralWidget函数设置中心窗口部件,来替换当前显示的子窗口界面。 总之,Qt提供了多种方式来实现多个UI界面切换,开发者可以根据具体需求选择合适的方法来实现界面的动态切换。通过这些方法,可以方便地实现复杂的界面逻辑和用户交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值