3

你能推荐一种设计模式或策略来优雅地处理基于屏幕的菜单导航吗?

其中“基于屏幕”是指一系列相互连接的全屏“页面”,其中包含链接到其他“屏幕”的按钮——例如在游戏的用户界面中。

我已经实现了一个基于状态的设计模式,我不推荐。
代码很快就会变得混乱,并且容易出现各种基于状态的错误,这些错误变得越来越难以测试。

例如:

void Update(float dt)
{
    switch(curState)
    {
        case kScreenA:
            ScreenA.Update(dt);
            if(ScreenA.IsDone())
                curState = kScreenB;
        break;
        etc...
}

使用这种方法,您最终需要处理返回条件:

void Update(float dt)
{
    switch(curState)
    {
       case kScreenA:
           ScreenA.Update(dt);
           if(ScreenA.IsDone())
           {
               if(ScreenA.ReturnState == 1)
                   curState = kScreenB;
               if(ScreenA.ReturnState == 2)
                   curState = kScreenC;
               etc...
            }
     }
}

同样使用这种方法,您最终可能需要处理进入条件:

void InitState()
{
    switch(nextState)
    {
        case kScreenC:
            if(curState == kScreenA)
                ScreenC.InitFromA();
            if(curState == kScreenB)
                ScreenC.InitFromB();
            etc...
     }
}

所以一定有更好的方法来设计这个,你能描述一个更好的方法吗?

干杯,
slushduck

4

2 回答 2

3

对于简单的菜单系统,您可以使用状态设计模式。创建一个接口 Menu 并使用具体类(FirstMenu、SecondMenu 等)实现它。创建一个 MenuContext 来绘制菜单并具有 currentSelected Menu 的引用。通过使用这个 currentSelected Menu,ContextMenu 知道将调用委托给正确的 Menu。您也可以使用状态模式拥有一个优雅的菜单树。 https://en.wikipedia.org/wiki/State_pattern

于 2016-05-08T22:10:16.607 回答
0

实现 GUI 的正常方式是首先使用MVPPresenter。如果你的菜单很复杂,有几个屏幕,那么你需要几个 MVP trios。

于 2011-11-16T18:37:21.450 回答