2011-01-14 78 views
2

XNA 如果我有一個按鈕類,並且我有一個buttonManager類,它根據當前的遊戲狀態來管理要繪製到屏幕上的按鈕(主菜單,在遊戲等),我如何組織我的代碼,以便當我點擊一個按鈕時,它將用戶帶到不同的屏幕。 (例如選項菜單,遊戲中)。 更具體地說,如果我要檢查用戶是否點擊了buttonManager中的按鈕,我將如何讓遊戲切換並運行實際的遊戲(它屬於完全不同的類)?XNA如何使用遊戲組件(管理器)組織代碼

  • 主要gameclass
  • buttonManager遊戲組件(添加按鈕)
  • Button類這樣做的

回答

2

一種方式是通過使用委託。另一種方法是建立一個所有類都用來確定狀態的全局類。

如果你不熟悉遊戲狀態的概念,我有我的網站上的教程緩解你進入基礎知識(在該教程的最後一個樣本使用代表以及!)

http://www.xnadevelopment.com/tutorials/thestateofthings/thestateofthings.shtml

+0

+1:這就是我的做法,這意味着我可以重新使用我的引擎,而不用硬編碼值。 – 2011-01-14 06:58:49

0

你的屏幕類(menuScreen,optionsScreen,gameplayScreen等)將需要保存它顯示的每個按鈕的功能。例如:

//in optionsScreen class' update method: 
if(input.gamepad.Buttons.A == ButtonState.Pressed && cursorSpriteRect.Intersects(button[0].Rect) 
{ 
    //begin transition into gameplay screen... or whatever 
} 
0

您的遊戲必須具有或能夠獲得對按鈕管理器的引用。通常你的遊戲將創建並擁有buttonManager。

class Game 
{ 
    ButtonManager m_buttonManager; 

    ... 
} 

你的按鈕管理器可以暴露像OnButtonClicked事件。

class ButtonManager 
{ 
    private Button m_playGameButton; 

    // delegate to define the type of the event handler 
    public delegate void ButtonClickedEventHandler(ButtonId buttonId); 

    // event object matching the type of the event handler 
    public event ButtonClickedEventHandler OnButtonClicked; 

    void Update() 
    { 
     ... 

     if (m_playGameButton.Clicked) 
     { 
     // Launch the event when appropriate if there are any subscribers 
     if (OnButtonClicked != null) 
     { 
      OnButtonClicked(ButtonId.PlayGame) 
     } 
     } 
    } 
} 

您的遊戲類可以訂閱事件並提供處理程序方法。

class Game 
{ 
    ... 

    void Initialise() 
    { 
     m_buttonManager += ButtonClicked; 
    } 

    void ButtonClicked(ButtonId buttonId) 
    { 
     switch (buttonId) 
     { 
      case ButtonId.PlayGame: 
       PlayGame(); 
       break; 

      case ButtonId.OptionsMenu: 
       OptionsMenu(); 
       break; 
     } 
    } 

    ... 
} 

或者,遊戲類可以輪詢按鈕管理器。

class Game 
{ 
    ... 

    void Update() 
    { 
     if (m_buttonManager.IsPlayGameButtonHit) 
     { 
     PlayGame(); 
     } 
     else if (m_buttonManager.IsOptionsMenuButtonHit) 
     { 
     OptionsMenu(); 
     } 
    } 

    ... 
}