netlib.narod.ru | < Назад | Оглавление | Далее > |
Класс TetrisGame также хранит все игровые компоненты в свойстве Components, унаследованном от класса игры. Вы можете добавить в этот список любой класс, наследуемый от класса GameComponent, и он будет автоматически вызываться, когда ваша игра запускается и когда обновляется. Он не будет вызываться при рисовании вашей игры, потому что в классе GameComponent нет метода Draw. Однако, вы можете реализовать собственные методы рисования или просто использовать класс DrawableGameComponent, в котором есть метод Draw. XNA не предоставляет прямой поддержки Draw для игровых компонентов; вы должны выполнять вызов самостоятельно, чтобы гарантировать, что все компоненты будут вызваны в правильном порядке. По этой и ряду других причин (вынуждающих вас использовать эту модель, почти не имеющую преимуществ, поскольку она усложняет тесты модулей, а ваши собственные классы игры могли бы быть более эффективными или специализированными и т.д.) мы не будем использовать в этой книге много игровых компонентов. Это замечательная идея, но вы можете прожить без нее, поскольку все равно так или иначе будете самостоятельно создавать игровые компоненты и также самостоятельно вызывать их методы Draw. Использовать их только ради метода Update не имеет большого смысла.
Как я упоминал в главе 1, основная идея была в сотрудничестве пользователей и совместном использовании их игровых компонентов, позволяющем другим использовать части вашего игрового движка. Например, компонент счетчика кадров или даже полнофункциональный движок визуализации трехмерных ландшафтов могут быть реализованы как игровые компоненты, но тот факт, что кто-то не использует игровые компоненты не означает, что просто скопировать код будет труднее. Например, если у вас есть сложный игровой компонент, такой как модуль визуализации ландшафта, он, скорее всего, привлекает какие-нибудь другие классы и использует собственный движок визуализации, из-за чего может сразу не заработать в вашем движке, если вы просто скопируете один файл. Независимо от способа, подключение внешнего кода часто требует рефакторинга, пока он не состыкуется с вашим собственным игровым движком. В первой бета-версии XNA Framework в XNA Game Studio Express был доступен модуль графического проектирования для игровых компонентов, позволяющий просто перетаскивать компоненты в ваш класс игры или даже в другие игровые компоненты, для добавления возможностей к вашей игре вообще без написания кода. Поскольку эта возможность была слишком сложной, глючной и не работала на Xbox 360, она была исключена во второй бета-версии XNA Framework.
Не следует быть уверенным, что игровые компоненты не будут использоваться, и, возможно, для большинства программистов не имеет значения отсутствие визуального разработчика и то, что метод Draw надо вызывать самостоятельно. Тогда будет доступно много игровых компонентов и было бы полезно знать их основы. В случае игры Тетрис на ум приходят несколько компонентов:
Непосредственно сетка со всеми цветными блоками и текущим падающим блоком.
Информационное табло с номером текущего уровня, счетом, рекордом и количеством уничтоженных линий.
Поле, показывающее тип следующего игрового блока.
Более простые вещи, такие как счетчик частоты кадров, обработка ввода и т.д.
Я решил в игре Тетрис реализовать как игровые компоненты только сетку и поле, показывающее следующий блок; весь код слишком прост, чтобы реализовать несколько новых классов для него. Если вы захотите, например, повторно использовать информационное табло, всегда можно поместить его в игровой компонент, но я не знаю никакой другой игры, которую мог бы написать, чтобы использовать это табло.
Взгляните пристальней на класс Game и компоненты, которые были добавлены к нему (рис. 4.2).
Рис. 4.2 |
Серые стрелки показывают, что эти методы вызываются автоматически, благодаря тому факту, что TetrisGrid и NextBlock были добавлены в список Components класса Game. В TetrisGame.Draw вызывается метод Draw из TetrisGrid, который вызывает метод NextBlock.Draw. TetrisGame сам содержит только экземпляр TetrisGrid. Экземпляр NextBlock используется только внутри класса TetrisGrid.
Как видите, использование игровых компонентов для этих трех классов заставляет вас думать о порядке вызовов и делает вашу игру более организованной, только благодаря факту, что вы не помещаете все скопом в один большой класс. Это хороший стиль и хотя, если вы опытный программист, то в состоянии сделать все это самостоятельно, для начинающих может оказаться хорошей идеей использование игровых компонентов в XNA.
netlib.narod.ru | < Назад | Оглавление | Далее > |