2011-01-14 72 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(); 
     } 
    } 

    ... 
}