游戏中一个简单的UI问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010848412/article/details/78218184

通常在设计ui框架的时候,会以类似栈的数据结构(非栈)进行存储管理,将打开界面进行入栈操作,将关闭界面进行出栈操作。

同时,在打开某界面的时候,可能将上个界面隐藏,在关闭这个界面的时候,恢复显示上个界面。

大致代码如下:

private void PushPanel(Panel panel, bool hidePrev = true)
    {
        if (panel == null)
        {
            return;
        }
        //隐藏之前界面
        if (hidePrev && panelStacks.Coun > 0)
        {
            panelStacks[panelStacks.Count - 1].HidePanel();
        }
        //入栈
        panelStacks.Add(panel);

    }
    private void PopPanel(Panel panel, bool showPrev = true)
    {
        if (panel == null)
        {
            return;
        }

        if (panelStacks.Count > 0)
        {   
            //出栈
            panelStacks.RemoveAt(panelStacks.Count - 1);
            //恢复之前界面
            if(showPrev && panelStacks.Count > 0)
            {
                panelStacks[panelStacks.Count - 1].ShowPanel();
            }
        }
    }


出现的问题:

假设已经打开了界面A。此时记录的信息为{A(show)}

打开界面B,设置隐藏上个界面。此时记录的信息为{A(hide), B(show)}

此时,再打开界面C,不设定隐藏上个界面。此时记录的信息为{A(hide), B(show), C(show)}

设定界面C的层级在B的下面,所以,玩家看到的界面还是界面B,而实际存放的栈顶是界面C。

将界面B关掉。此时记录的信息为{A(hide), B(show)}
将界面C关掉。此时记录的信息为{A(hide)}

可以看到,此时还存留一个隐藏的界面A。无法被正常的关闭。


解决方案:

1)打开界面,不能简单以时间为顺序进行入栈,还应该判断对应的层级关系。

2)关闭界面时,不能单纯以栈顶进行索引,最好以名称进行索引,才不会出现顺序错乱。



猜你喜欢

转载自blog.csdn.net/u010848412/article/details/78218184