XNA如何使用游戏组件(管理器)组织代码

时间:2011-01-14 01:42:09

标签: class components xna

XNA 如果我有一个按钮类,并且我有一个buttonManager类来管理根据当前游戏状态(主菜单,游戏等)绘制到屏幕的按钮,我该如何组织我的代码以便我点击一个按钮,它将用户带到另一个屏幕。 (例如选项菜单,游戏)。 更具体地说,如果我要检查用户是否点击了buttonManager中的按钮,我将如何切换游戏并运行实际游戏(这是一个完全不同的类)?

  • 主要游戏类
  • buttonManager游戏组件(添加按钮)
  • 按钮类

3 个答案:

答案 0 :(得分:2)

这样做的一种方法是使用委托。另一种方法是拥有一个所有类用于确定状态的全局类。

如果您不熟悉游戏状态的概念,我在我的网站上有一个教程,让您轻松学习基础知识(该教程中的最后一个示例也使用了代理!)

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

答案 1 :(得分: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
} 

答案 2 :(得分: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();
      }
   }

   ...
}