netlib.narod.ru< Назад | Оглавление | Далее >

Класс Game

Вы уже использовали класс Game в предыдущих главах, но помимо запуска игры и ваших тестов модулей вызовом метода Run из класса Program, а также использования методов Initialize, Update и Draw, о лежащих в основе проектных решениях ничего не говорилось. Да, для создания нескольких простых игр вам не требуется знать что-либо еще, но по мере того как игры будут становиться больше и обрастать новыми возможностями, вы захотите больше узнать о классе игры и его дизайне.

Сам по себе класс Game используется для хранения графического устройства в экземпляре GraphicsDeviceManager и диспетчера содержимого в поле содержимого. Из класса Program вы просто создаете экземпляр класса игры и вызываете метод Run, чтобы все запустилось. Вам не надо, как в старые дни DirectX для управляемого кода или OpenGL, управлять собственным окном, создавать игровой цикл, обрабатывать сообщения Windows и т.д. XNA делает все это за вас и поэтому возможно запускать вашу игру на платформе Xbox 360, где недоступны ни классы окон ни события Windows.

Осталась возможность получить доступ к окну игры через свойство Window класса игры. Оно может использоваться для задания заголовка окна, определения, может ли пользователь менять размер окна, получения нижележащих дескрипторов Windows для вызова методов взаимодействия с системой и т.д. На платформе Xbox 360 все эти методы ничего не делают. Здесь нет окна, нет заголовка окна и, соответственно, нечему менять размер. В предыдущей игре вы использовали свойство Window.Title для помещения в заголовок простого текста, отображающего текущий уровень и счет. Причина этого в том, что в XNA нет поддержки шрифтов; для визуализации текста на экране вам надо создать собственный растровый шрифт и самостоятельно визуализировать каждую букву. В следующих играх и даже для игры Тетрис вам понадобится эта возможность, и через несколько минут вы познакомитесь с классом TextureFont.

К тому же стоит упомянуть, что в конструкторе класса игры можно установить предпочтительное разрешение, задав графические свойства, как в приведенном ниже примере, пытающемся использовать разрешение 1024 × 768 в полноэкранном режиме:

graphics.PreferredBackBufferWidth  = 1024;
graphics.PreferredBackBufferHeight = 768;
graphics.IsFullScreen = true;

Это не гарантирует, что игра действительно будет запущена в данном режиме; например, установка разрешения 1600 × 1200 на системе, поддерживающей только 1024 × 768, приведет лишь к использованию максимального из доступных разрешений.

Вы уже знаете, что методы Update и Draw вызываются в каждом кадре, но как включить новые игровые компоненты не перегружая непосредственно класс игры? Пришло время взглянуть на класс игры и компоненты в клоне игры Тетрис (рис. 4.1).


Рис. 4.1

Рис. 4.1


Первое, что бросается в глаза, — наличие трех игровых классов, вместо одного, как в предыдущих примерах игр. Это делается чтобы главный класс игры был короче и проще. Класс BaseGame содержит диспетчер графики с графическим устройством, диспетчер содержимого и текущие значения ширины и высоты для того разрешения, в котором запущена игра. Методы Update и Draw теперь обращаются к новым классам Input, Sound и TextureFont, чтобы больше не приходилось менять их код в главном классе игры. Класс TetrisGame используется для загрузки всей графики из конвейера содержимого и инициализации всех спрайтов и игровых компонентов, о которых вы узнаете чуть позже.

И, наконец, класс TestGame наследуется от класса TetrisGame для получения доступа ко всем текстурам, спрайтам и игровым компонентам, и используется только в режиме отладки для запуска тестов модулей. Функциональность класса TestGame подобна той, которая рассматривалась в предыдущих главах, но на этот раз код лучше организован и отделен от основного класса игры. Класс TetrisGame использует несколько тестовых модулей, чтобы гарантировать, что каждая из частей игры работает так, как планировалось.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz