Как организовать несколько игровых компонентов XNA? - PullRequest
0 голосов
/ 24 января 2011

Я программирую на XNA и мне нужна помощь в организации моих классов и кода: У меня есть класс кнопок и менеджер кнопок. У меня также есть класс сцены и менеджер сцены.

Диспетчер кнопок обрабатывает различные кнопки, которые будут отображаться на разных экранах, поскольку почти на всех экранах есть кнопки. Менеджер сцены делает то же самое, за исключением того, что вместо кнопок он обрабатывает фоновые объекты сцены, которые просто необходимо нарисовать. Оба менеджера зависят от текущего состояния игры, чтобы определить, какие кнопки или объекты сцены нужно нарисовать.

Как мне организовать свой код, чтобы оба менеджера знали, каково текущее состояние игры? (Оба менеджера создаются внутри основного класса игры, и оба менеджера являются компонентами игры)

Ответы [ 2 ]

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

Ключевое слово, которое вы ищете, описывающее вашу проблему, - «Управление состоянием игры». На веб-сайте XNA есть несколько хороших статей, обязательно прочитайте это: http://create.msdn.com/en-US/education/catalog/sample/game_state_management

Теперь, чтобы ответить на ваш вопрос более прямо. Скажем, у вас есть 2 разных состояния -Меню -Game

Сначала создайте класс State с методами для настройки рисования и обновления правильных элементов пользовательского интерфейса.

Теперь создайте класс MenuState, производный от State, и переопределите методы setup, draw и update. В метод установки введите весь код для создания правильного меню. (Как Scene.MenuItems.Clear (); Scene.MenuItems.Add (новая метка (..)); и т. Д.). Сделайте то же самое для методов обновления и отрисовки (обновляйте и отрисовывайте каждый элемент управления, захватывайте события, передаваемые щелчками по кнопкам и т. Д.) *

Сделайте то же самое для GameState.

Теперь в вашем коде сцены сделайте поле «State state». Когда пользователь нажимает escape, установите состояние (новое) MenuState. Когда пользователь возвращается в игру, установите состояние (новое) GameState. В методах обновления и рисования сцены поместите вызов state.Update (..) и state.Draw (..). Поскольку вы переопределили эти методы в GameState и MenuState, будут выполнены правильные действия.

Этот подход решает проблему наличия элементов управления gazzillion, которые выполняют проверки вроде «if (scene.StateEnum == StateEnum.SomeState) {DoThis ();}». Вам будет легче управлять этим.

Также подумайте о создании других концептуальных классов. Как и у MenuState может быть подсостояние «Меню опций». Может быть, придумать форму класса и т.д ...

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

SInce GameComponent имеет свойство Game, вы можете использовать его для приведения класса в класс Game или, в качестве альтернативы, для получения Сервиса, отображающего статус игры.

...