XNA как организовать код с игровыми компонентами (менеджеры) - PullRequest
2 голосов
/ 14 января 2011

XNA Если у меня есть класс кнопок, и у меня есть класс buttonManager, который управляет отображением кнопок на экране в зависимости от текущего состояния игры (главное меню, в игре и т. Д.), Как мне организовать свой код, чтобы при Я нажимаю на кнопку, она переводит пользователя на другой экран. (например, меню опций, игра). Если быть более точным, если бы я поставил чек, чтобы увидеть, нажимает ли пользователь на кнопку внутри buttonManager, как бы я переключил игру и запустил саму игру (которая находится в совершенно другом классе)?

  • Основной игровой класс
  • Компонент ButtonManager (добавляет кнопки)
  • Кнопка класса

Ответы [ 3 ]

2 голосов
/ 14 января 2011

Один из способов сделать это - использовать делегатов.Другим способом было бы иметь глобальный класс, который все классы используют для определения состояния.

Если вы не знакомы с концепцией игрового состояния, на моем сайте есть учебник, в котором вы познакомитесь с основами (и в последнем примере этого руководства также используются делегаты!)

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

0 голосов
/ 14 января 2011

Ваша игра должна иметь или иметь возможность получить ссылку на менеджер кнопок. Обычно ваша игра создаст и владеет 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();
      }
   }

   ...
}
0 голосов
/ 14 января 2011

Ваш класс экрана (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
} 
...