【问题标题】:A Design Pattern for Menu Navigation (in c/c++)菜单导航的设计模式(c/c++)
【发布时间】:2011-12-30 16:53:52
【问题描述】:

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

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

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

例如:

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...
     }
}

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

干杯,
小鸭子

【问题讨论】:

    标签: c++ c user-interface hud


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      实现 GUI 的正常方式是使用 MVPpresenter first。如果您的菜单很复杂,有多个屏幕,那么您需要多个 MVP trios。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-03
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多