2011-11-16 53 views
3

您可以推薦一個設計模式或策略來優雅地處理基於屏幕的菜單導航嗎?菜單導航的設計模式(在c/C++中)

其中「基於屏幕」是指一系列相互連接的全屏「頁面」,並帶有鏈接到其他「屏幕」的按鈕 - 例如在遊戲的用戶界面中。

我已經實現了一個基於狀態的設計模式,我不建議這樣做。
代碼變得雜亂無章,變得越來越容易出現各種基於狀態的錯誤,這些錯誤越來越難以測試。

如:

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

通過這種方法,你最終需要處理的回報條件:

void InitState() 
{ 
    switch(nextState) 
    { 
     case kScreenC: 
      if(curState == kScreenA) 
       ScreenC.InitFromA(); 
      if(curState == kScreenB) 
       ScreenC.InitFromB(); 
      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... 
      } 
    } 
} 
用這種方法,你可能最終需要處理進入條件

而且

所以必須有更好的方法來設計這個,你能描述一個更好的方法嗎?

乾杯,
slushduck

回答

0

實現GUI的正常方式是使用MVPpresenter first。如果你的菜單比較複雜,那麼你需要幾個MVP三重奏。

1

對於簡單的菜單系統,您可以使用狀態設計模式。 創建一個界面菜單並使用具體的類來實現它(FirstMenu,SecondMenu等)。創建一個MenuContext,它繪製菜單並具有currentSelected菜單的引用。通過使用這個currentSelected Menu,ContextMenu知道將呼叫委託給適當的菜單。你可以使用狀態模式來使用一個優雅的菜單樹。 https://en.wikipedia.org/wiki/State_pattern