netlib.narod.ru | < Назад | Оглавление | Далее > |
Начавшаяся несколько лет назад в Microsoft разработка XNA держалась в глубоком секрете. На GDC (самой большой ежегодной конференции разработчиков игр) в 2004 году Microsoft впервые анонсировала XNA. XNA это не просто набор библиотек, подобно DirectX; она также, для облегчения жизни разработчиков, включает набор утилит и даже собственную интегрированную среду разработки (IDE), унаследованную от Visual Studio. До 2006 года не было выпущено никаких утилит или кода, и разработчики, использующие DirectX, с 2004 по 2006 год только видели логотип XNA в верхнем правом углу документации DirectX SDK (рис. 1.1). (XNA просто означает «XNA не акроним».)
Рис. 1.1 |
Это значит, что Microsoft долгое время работала над XNA Framework, но разработчики не знали чего ожидать. Это мог быть преемник DirectX Framework, но когда в конце 2005 года была выпущена бета-версия Direct3D 10 для Windows Vista, оказалось, что DirectX все еще остается основной графической библиотекой даже в этой новой операционной системе. В начале 2006 года на GDC Microsoft представила XNA Build March 2006 CTP. XNA Build — это утилита, позволяющая управлять сложным процессом построения приложений, аналогичная Msbuild и таким инструментам, как Ants, но более мощная и сложная. Microsoft выпустила игру MechCommander 2 с открытым кодом (Shared Source) и много людей загрузили ее и пытались самостоятельно построить. В результате стало ясно, что разработчики, особенно небольшие и средние компании, не нуждаются в столь сложном инструменте для управления построением приложений.
После этого наступило затишье, и только персонал Microsoft и DirectX MVP (к счастью, я один из них) знали о грядущем пришествии XNA Framework и XNA Game Studio. Остальной мир узнал об этом на августовской конференции Gamefest (новая конференция разработчиков игр, организованная Microsoft), где Microsoft 30 августа 2006 года анонсировала первую бета-версию XNA Game Studio Express. Первая бета-версия содержала только один пример для разработчиков, Space Wars, и, кроме того, в XNA было достаточно мало функциональности для трехмерных игр. Множество разработчиков и любителей попробовали XNA и написали массу небольших двухмерных игр с помощью класса Sprite из XNA. Хотя вы и могли быстро создать собственный клон Pong или простенькую игру в стиле «убей их всех», написание собственной процедуры импорта трехмерных моделей или визуализатора оставалось сложной задачей.
Первоначально XNA Game Studio Express была предназначена для начинающих, любителей и студентов, чтобы позволить им быстро создавать собственные игры для Windows и Xbox 360. Это не значит, что профессиональные разработчики не могут использовать XNA. В 2007 году Microsoft собирается выпустить специальную версию XNA Game Studio Professional, предназначенную для профессиональных игровых студий, но если вы хотите выполнять разработку в Visual Studio 2005 Professional, воспользуйтесь приведенными в этой главе советами о совместной работе VS и XNA.
Несколько месяцев спустя, в ноябре 2006 года, Microsoft выпустила другую бета-версию, а в декабре 2006 увидел свет окончательный вариант XNA Game Studio Express, включающий конвейер содержимого и множество новых возможностей, о которых вы узнаете в главах 2 и 3.
XNA является полностью бесплатной и позволяет разработчикам одновременно создавать игры для Windows и для Xbox 360. Но если вы хотите запускать ваши XNA игры на приставке Xbox 360, вам надо будет присоединиться к клубу разработчиков Creators Club с ежегодным взносом 99 долларов.
На рис. 1.2 показана XNA Game Studio Express. Чуть позже вы узнаете как установить ее.
Рис. 1.2 |
Окно не просто выглядит похожим на Visual C# 2005 Express — это оно и есть. Отличия заключаются в небольших изменениях параметров проекта, если вы создаете XNA-приложение. Кроме того, появились дополнительные команды в меню Tools | Options, позволяющие выбрать устройство Xbox 360 и ввести ключ шифрования. Есть еще несколько нововведений в среде разработки, например, конвейер содержимого, позволяющий вам быстро импортировать в ваш проект текстуры, модели и шейдеры. Все это мы подробнее обсудим чуть позже.
На данный момент XNA Game Studio Express является единственной средой разработки для создания игр с XNA Framework, но Microsoft в 2007 году собирается выпустить XNA Game Studio Pro. XNA Game Studio Professional будет основана на Visual Studio 2005 Professional Edition и позволит вам использовать все возможности и подключаемые модули Visual Studio. Если у вас есть Visual Studio 2005 и вы попробуете создать проект XNA, то обнаружите отсутствие шаблонов. Что еще хуже, если вы попытаетесь открыть файл .csproj, созданный в XNA Game Studio Express, Visual Studio не сможет открыть проект. Он не поддерживается. Несколько советов о том, как заставить XNA Framework работать с Visual Studio 2005 вы найдете в разделе «А что насчет Visual Studio 2005 Professional?» в этой главе.
Microsoft также упоминала еще одну версию среды разработки для XNA, называемую просто XNA Studio, базирующуюся на Visual Studio Team System и предназначенную для больших студий. Узнать больше об XNA Framework вы можете по адресу http://msdn.microsoft.com/directx/xna/faq.
XNA Framework делится на три основные части (рис. 1.3):
Графический движок XNA в Microsoft.XNA.Framework.dll.
Модель игрового приложения XNA в Microsoft.XNA.Framework.Game.dll.
Конвейер содержимого XNA в Microsoft.XNA.Framework.Content.Pipeline.dll.
Рис. 1.3 |
Все эти библиотеки написаны на C# и являются полностью управляемыми. Это значит, что вы можете открыть их, например, с помощью утилиты Reflector (возьмите ее по адресу http://www.aisto.com/roeder/dotnet/) и посмотреть, как они работают (рис. 1.4). Большая часть функциональности просто вызывает библиотеки DirectX, слегка упрощая работу с ними. Конвейер содержимого мы обсудим чуть позже.
Рис. 1.4 |
Взгляните на модель приложения. Каждый проект XNA использует класс Game, в котором содержатся все важные компоненты игры, графическое устройство, параметры окна и диспетчер содержимого. Вы можете добавить сюда обработку ввода и работу со звуком. Фактически, все, что ваша игра делает на самом высоком уровне, коренится в классе игры, или, по крайней мере, находится в каком-нибудь компоненте, к которому можно получить доступ из этого класса.
На рис. 1.5 показаны три самых важных метода класса игры. В последних версиях Microsoft добавила в класс Game1.cs, создаваемый автоматически при создании нового проекта XNA, вспомогательные методы LoadGraphicsContent и UnloadGraphicsContent, но в этой книге они не используются, поскольку значительно проще объединить весь код инициализации и загрузки в одном месте — функции Initialize.
Рис. 1.5 |
Initialize()
Update(GameTime time)
Draw(GameTime time)
Возможно, вы уже сообразили, что делают эти методы. Initialize загружает все содержимое игры, устанавливает начальные параметры и инициализирует все, что необходимо. Если вы хотите следовать шаблону проектирования, предложенному для XNA Microsoft, разместите все операции загрузки в методе LoadGraphicsContent. Update вызывается перед рисованием каждого кадра для обновления игрового времени, ввода, работы со звуком, и всего того, что не видно на экране. Если ваша игра сильно нагружает видеокарту, то вполне возможно, что Update будет вызываться гораздо чаще, чем Draw, так что учтите, что код обновления должен быть независимым от кода рисования. Ни в одном из примеров этой книги не надо беспокоиться о том, сколько раз вызывается Update и сколько раз Draw. И, наконец, Draw вызывается в каждом кадре для рисования всего, что выводится на экран. Разделение между Update и Draw не является принципиальным, и почти всегда может игнорироваться при тестировании модулей, но в окончательной версии игры важно гарантировать, что игровая логика работает независимо от кода рисования. Например, в Windows пользователь может нажать комбинацию клавиш Alt и Tab или свернуть окно, и в этом случае вызывать Draw вообще не надо, но возможно, вы захотите, чтобы игра продолжала работать в фоновом режиме. Это особенно важно для сетевых игр, чтобы гарантировать сохранение синхронизации игроков.
Помимо этого, вы можете добавлять к вашему классу игры классы GameComponent, в которых тоже есть методы Update и Draw. Эти методы автоматически вызываются из методов Update и Draw вашей игры. Инициализация может выполняться непосредственно в конструкторе. Первоначально Microsoft предполагала, что разработчики будут создавать и добавлять игровые компоненты с помощью средств проектирования Visual Studio, которые были в первой бета-версии XNA Game Studio Express (от 30 августа 2006 года). Позднее возможность проектирования была удалена, поскольку она работала не слишком хорошо, не поддерживала платформу Xbox 360, и ей пользовалось мало разработчиков.
Идея игровых компонентов заключается в повторном использовании частей кода с возможностью простой их вставки в ваши игры. Это может быть, например, счетчик частоты кадров или визуализатор небесного куба с наложением текстур для трехмерного фона. Мне кажется, здесь два основных недостатка: нет стандартных компонентов, поставляемых с XNA и не слишком трудно закодировать такую модель приложения и даже расширить ее. В этой книге я редко использую классы GameComponent, но вам ничто не мешает добавить свои собственные. В главе 4 класс GameComponent обсуждается более подробно, и вы узнаете о его преимуществах и недостатках. Поскольку у класса игры есть свойство Components, добавлять компоненты очень просто.
Не поймите меня неправильно, основная идея игровых компонентов действительно хороша; когда вышла первая бета-версия XNA, была доступна небольшая презентация Митча Уолкера (Mitch Walker), руководителя проекта XNA Framework в Microsoft, об игровых компонентах и том, как их комбинировать. Сперва я был не слишком уверен, что думать о конвейере содержимого и идее игровых компонентов; в презентации они выглядели замечательно, но, начав программировать мои первые игровые проекты с XNA, я обнаружил, что работать с инструментами проектирования, имеющимися в первой бета-версии не слишком удобно. Во второй бета-версии и в конечной версии большинство исходного кода игровых компонентов было удалено, также как и компонент графического проектирования в XNA Game Studio. Это случилось потому что Microsoft не смогла найти приемлемый способ реализации проектировщика и идеи игровых компонентов для приставки Xbox 360 (прежде они работали только на платформе Windows). Это подтвердило мое первое ощущение, что идея игровых компонентов не слишком полезна, и даже может ограничить вас в некоторых отношениях, таких, как необходимость самому беспокоиться о рисовании (более подробно это обсуждается в главе 4).
Действительно, реализация в каждой игре собственного пользовательского интерфейса и логики меню вызывает трудности. Но подумайте о том, что стандартная система меню, подобная используемой в Windows, в каждом приложении очень скучна, а изучение новых способов создания меню в каждой игре приводит к накоплению полезного опыта. Если вы хотите создать новую игру, совсем несложно будет извлечь код и создать собственный игровой компонент, который можно повторно использовать (например, класс SkyCubeMapping). Хорошими примерами игровых компонентов, которые можно использовать во многих играх, являются показанные в главе 4 классы камеры и захвата кадров, но почти все остальное в играх из этой книги реализуется без использования игровых компонентов.
Одна из надежд, которые Microsoft возлагает на эту модель приложения, заключается в том, что сообщество разработчиков игр будет создавать и распространять игровые компоненты, что упростит создание игр и повысит привлекательность XNA. За дополнительной информацией можете обратиться к проекту eXperience, находящемуся по адресу www.codeplex.com.
Конвейер содержимого (content pipeline) используется для импорта, сборки и загрузки игровых составляющих, таких как текстуры, трехмерные модели, шейдеры и звуковые файлы, в вашем игровом проекте (рис. 1.6). Это значительно сокращает объем кода, необходимого для получения в вашей игре графики, трехмерных данных и шейдеров. Например, если вы поместите в свой проект файл модели, которая использует две текстуры и определенный шейдер, конвейер содержимого обработает файл модели и автоматически найдет и добавит необходимые текстуры и шейдеры. Вам не надо делать это самостоятельно; импортер содержимого «скомпилирует» данные в двоичный формах и в ходе этого процесса соберет все, что вам необходимо.
Рис. 1.6 |
Предположим, что шейдер, добавляемый к вашему проекту через модель, содержит ошибку. Раньше вы бы запустили игровой проект, а затем получили исключение, сообщающее, что шейдер не компилируется и игра не может работать. Теперь шейдеры компилируются в процессе построения и вам не надо запускать игру, чтобы увидеть, что она не работает. Вы можете быстро исправить ошибку, воспользовавшись номером строки и сообщением об ошибке, выводимым XNA Game Studio Express в окне с отчетом о компиляции, а затем заново собрать приложение.
Конвейер содержимого не является одной библиотекой, он состоит из пяти различных DLL:
Microsoft.Xna.Framework.Content.Pipeline.dll содержит базовые функции для конвейера содержимого.
Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll используется для компиляции и импорта шейдеров.
Microsoft.Xna.Framework.Content.Pipeline.FBXImporter.dll это самая большая из библиотек, содержащая код для импорта файлов трехмерных моделей формата .fbx и поддерживающая множество функций, например текстурирование и кости.
Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll используется для импорта в вашу игру файлов текстур. Это могут быть файлы используемого в DirectX формата .dds (лучший формат для текстур, поддерживающий аппаратное сжатие), но также поддерживаются и форматы .png, .jpg, .bmp и .tga. Двухмерные спрайты также являются текстурами и для них обычно используется несжатый 32-разрядный формат.
Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll позволяет вам импортировать файлы трехмерных моделей формата .x, используемого во многих приложениях и примерах DirectX.
Самой игре эти библиотеки не нужны, они используются при построении приложения для компиляции содержимого в файл .xnb (XNA Binary). Это упрощает распространение, поскольку вам больше не надо беспокоиться о файлах с игровым содержимым; легче при начале игры удостовериться, что все скомпилированные файлы содержимого на месте. Не модифицируйте файлы .xnb, это скомпилированный формат, подобный файлам .exe и его нельзя редактировать напрямую. Скомпилированные данные не могут быть преобразованы обратно в текстуры модели и шейдеры (теоретически это возможно, но инструментов для этого нет). Кроме того, файлы .xnb для Windows и Xbox 360 сильно различаются, хотя исходный код игры и исходные файлы с содержимым могут быть одними и теми же.
Заметьте, что вы можете создавать собственные обработчики содержимого, позволяющие компилировать в файл .xnb игровые компоненты других типов (например, модели в других форматах). Мы исследуем эту возможность в части II, когда будем добавлять к моделям данные о касательных для шейдера наложения карт нормалей.
Ладно, это все основы, которые нужны вам сейчас. Пришло время двинуться дальше и начать программировать вашу первую игру.
netlib.narod.ru | < Назад | Оглавление | Далее > |