【问题标题】:XNA how to organize code with game components (managers)XNA 如何用游戏组件组织代码(经理)
【发布时间】:2011-01-14 01:42:08
【问题描述】:

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

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

【问题讨论】:

    标签: class components xna


    【解决方案1】:

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

    如果您不熟悉游戏状态的概念,我的网站上有一个教程可以帮助您了解基础知识(该教程中的最后一个示例也使用了委托!)

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

    【讨论】:

    • +1:我就是这样做的,这意味着我可以在没有硬编码值的情况下重复使用我的引擎。
    【解决方案2】:

    您的屏幕类(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
    } 
    

    【讨论】:

      【解决方案3】:

      您的游戏必须具有或能够获得对按钮管理器的引用。通常你的游戏会创建并拥有 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();
            }
         }
      
         ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2010-10-08
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多