Лабораторная работа №1: Введение в XNA Game Studio 2.0/3.0
В этой лабораторной работе мы рассмотрим среду разработки, в которой нам предстоит работать, а так же изучим стандартный игровой проект, на основе которого создаются компьютерные игры.
Цель работы:
научиться работать со стандартным игровым проектом
Задачи работы:
Создать стандартный игровой проект
Изучить его устройство
Изучить содержимое и особенности файла Program.cs
Ознакомиться с упрощенной схемой работы игры
Изучить назначение методов стандартного игрового проекта и особенности подключаемых к нему пространств имен (файл Game1.cs)
Создаем игровой проект
пометка - приведенный материал предназначен для XNA Game Studio 2.0 но для версии 3.0 все будет работать практически идентично, если что задавайте вопросы в комментариях или на форуме. вместо Microsoft Visual C# 2005 Express Edition нужно использовать Microsoft Visual C# 2008 Express Edition
Перед выполнением этой лабораторной работы убедитесь, что на ПК установлена среда разработки Visual Studio и XNA 2.0.
Для запуска среды разработки, выполните команду Пуск - Все программы - Microsoft Visual C# 2005 Express Edition. Дальнейшие примеры будут показаны именно с использованием Express-версии. Выполните команду File - New Project – откроется окно New Project, в котором нам предлагают выбрать один из стандартных типов проектов (рис. 1.1.)
Рис. 1.1. Выбор типа создаваемого проекта
В левой части окна выберем пункт XNA Game Studio 2.0., в правой – Windows Game (2.0.). Имя проекта, сгенерированное автоматически (поле Name) заменим на имя P1_1. После нажатия на кнопку OK шаблонный проект будет создан. Вот как выглядит окно среды разработки после его создания (рис. 1.2.).
Рис. 1.2. Среда разработки после создания шаблонного проекта
Если вы выполняете сейчас эту лабораторную работу, то вы, скорее всего, имеете опыт работы с Visual Studio. Можно заметить, что внешний вид среды разработки выглядит вполне традиционно. Правую часть окна занимают панели Solution Explorer и Properties, в нижней части окна можно видеть окно Error List, основное пространство занято окном редактора кода.
Напомним, что Solution Explorer используется для просмотра и модификации файлов, которые входят в проект, для добавления новых файлов в проект, окно Properties применяется для модификации свойств выделенного объекта, окно Error List содержит сообщения об ошибках, которые генерируются при выполнении программы, а окно редактора кода применяется при редактировании текстов программ. Основная деятельность по созданию игры ведется именно с использованием вышеупомянутых инструментов.
Для тестового запуска игры служат команды Debug(Start Debugging и Debug(Start Without Debugging. Если сейчас мы попытаемся запустить игру, мы увидим лишь пустое окно (рис. 1.3.).
Рис. 1.3. Окно шаблонного проекта
Это окно готово для ваших игровых экспериментов. Рассмотрим важнейшие элементы содержимого панели Solution Explorer (рис. 1.4.).
Рис. 1.4. Панель Solution Explorer
Файл Program.cs – это обычный файл программы на C#. Точно такие же файлы обычно генерируются при создании консольных Windows-приложений на C#. Данный файл играет важную роль – в нем содержится точка входа в программу, с него начинается исполнение игры, и именно в нем содержится команда, которая запускает игру. Файл Game1.cs – это файл, в котором хранится программный код игры. Как правило, вышеописанный Program.cs в модификации не нуждается, а вот Game1.cs – это файл, с которым приходится работать в процессе создания игры. Причем, игры обычно включает в себя множество файлов с программным кодом. Папка Content содержит игровой контент – то есть – файлы различных форматов, которые используются в игре. Рассмотрим код стандартного проекта. Нам придется модифицировать этот код в процессе создания собственных игр.
Разбор кода стандартного игрового проекта
В листинге 1.1. приведено содержимое файла Program.cs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
usingSystem; namespace P1_1 { staticclass Program { /// /// The main entry point for the application. /// staticvoid Main(string[] args) { using(Game1 game =new Game1()) { game.Run(); } } } }
Как видите, выглядит он вполне стандартно. В теле статического метода Main содержатся команды создания нового объекта класса Game1. Объекту присваивается имя game, после чего выполняется метод Run объекта Game, который и запускает игру.
Упрощенно структуру игрового проекта можно представить так (Табл. 1.1.).
Таблица 1.1. Структура игрового проекта
Инициализация
На этапе инициализации проекта проводится инициализация графической и звуковых подсистем, системы ввода данных.
Загрузка ресурсов
Здесь загружаются игровые ресурсы, такие, как текстуры и трехмерные модели, звуки, шрифты.
Начало игрового цикла
Основные действия, которые выполняются при работе игры, организованы в виде игрового цикла. Фактически, игровой цикл – это обязательный элемент любой игры.
Считывание данных пользовательского ввода
Пользователь управляет игрой с помощью различных устройств ввода данных. В нашем случае это – клавиатура и мышь. Здесь так же может обрабатываться информация, поступающая от других устройств ввода. Например – от джойстика.
Игровые вычисления
Игровые вычисления включают в себя все вычисления, которые необходимы для организации игрового процесса. В частности, здесь обсчитываются позиции игровых объектов, проводятся вычисления, связанные с работой искусственного интеллекта, вычисления, связанные с проверкой столкновений игровых объектов, игровая физика, подсчет очков, набранных игроком и так далее. Если речь идет об оптимизации быстродействия игры, то такая оптимизация обычно касается именно игровых вычислений, так как на них тратится большая часть времени выполнения игрового цикла.
Проверка критерия прекращения игры
Игровой цикл продолжается до тех пор, пока игра не будет прекращена. Например, критерием останова может быть истечение времени, выделенного игроку на выполнение игровой задачи, набор определенного количества очков, какое-то событие, произошедшее в процессе игры, принудительная остановка игры, если пользователь решил прекратить играть и так далее.
Вывод изображений, проигрывание звуков
После завершения этапа игровых вычислений в программе имеются данные для визуализации. В частности, имеются данные о новых позициях объектов, о сообщениях, которые нужно вывести на игровое поле, о звуках, которые нужно воспроизвести. На данном этапе проводится перемещение объектов по игровому полю, вывод сообщений, проигрывание звука.
Конец игрового цикла
Игровой цикл заканчивается после выполнения условия останова игры.
Освобождение ресурсов
На последнем этапе работы игры проводится освобождение системных ресурсов, занятых игрой и выход из игры.
В стандартном игровом проекте все эти этапы представлены с помощью специальных методов. Эти методы унаследованы созданным игровым проектом от класса Game, который служит основой для проекта. Итак, это следующие методы (табл. 1.2.).
Таблица 1.2. Методы стандартного игрового проекта
Game1()
Общая инициализация. Game1() – это конструктор класса Game1, который выполняется при создании объекта Game в процедуре Main файла Program.cs
Initialize()
Инициализация игры
LoadContent()
Загрузка игровых ресурсов
Run()
Запуск игрового цикла. Как было показано выше, метод Run() вызывается в процедуре Main файла Program.cs
Update()
Игровой цикл в стандартном проекте состоит из двух методов. Первый из них – это метод Update(), в котором выполняется прием пользовательского ввода, все необходимые вычисления, проверка критериев останова игры.
Draw()
Второй метод игрового цикла – это метод Draw(), который содержит код для визуализации игровой графики
UnloadContent()
По окончании игрового цикла этот метод освобождает системные ресурсы.
Теперь, когда мы ознакомились с типичной структурой игры и назначением стандартных методов, рассмотрим код класса Game1 (Листинг 1.2.). В стандартном игровом проекте можно найти англоязычные комментарии. Здесь, для большей наглядности кода, они опущены. Комментарии, ключевые для понимания работы отдельных методов, приведены на русском языке.
usingSystem;usingSystem.Collections.Generic;usingMicrosoft.Xna.Framework;usingMicrosoft.Xna.Framework.Audio;usingMicrosoft.Xna.Framework.Content;usingMicrosoft.Xna.Framework.GamerServices;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework.Input;usingMicrosoft.Xna.Framework.Net;usingMicrosoft.Xna.Framework.Storage;namespace P1_1{publicclass Game1 : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch;public Game1(){ graphics =new GraphicsDeviceManager(this); Content.RootDirectory="Content";}protectedoverridevoid Initialize(){// Сюда следует добавить код инициализацииbase.Initialize();}protectedoverridevoid LoadContent(){ spriteBatch =new SpriteBatch(GraphicsDevice);// Сюда надо добавить код загрузки игровых ресурсов}protectedoverridevoid UnloadContent(){// Код выгрузки игрвоых ресурсов}protectedoverridevoid Update(GameTime gameTime){// Эта последовательность команд обрабатывает пользовательский ввод и позволяет завершать игру, // она рассчитана на использование джойстикаif(GamePad.GetState(PlayerIndex.One).Buttons.Back== ButtonState.Pressed)this.Exit();// Сюда следует добавить код игровых вычисленийbase.Update(gameTime);}protectedoverridevoid Draw(GameTime gameTime){ graphics.GraphicsDevice.Clear(Color.CornflowerBlue);// Сюда следует добавить код визуализации игровых объектовbase.Draw(gameTime);}}}
Рассмотрим каждый из приведенных выше методов. В листинге 1.3. приведен код метода Game1().
Листинг 1.3. Код метода Game1()
1
2
3
4
5
6
public Game1(){ graphics =new GraphicsDeviceManager(this); Content.RootDirectory="Content";}
Метод Game1() – это конструктор класса Game1. Команда graphics = new GraphicsDeviceManager(this); создает новое игровое окно, а объект graphics используется для проведения различных графических операций. Например, с помощью этого объекта можно настраивать ширину и высоту окна, переводить игру в полноэкранный режим.
Команда Content.RootDirectory = "Content"; позволяет указать место (в нашем случае – это папка Content), где хранятся игровые ресурсы.
Помимо описанных команд, автоматически включаемых в стандартный игровой проект, конструктор может содержать и другие команды. Например, команды дополнительной настройки объекта graphics.
В листинге 1.4. приведен код метода Initialise().
Листинг 1.4. Код метода initialise()
1
2
3
4
5
6
7
protectedoverridevoid Initialize(){// Сюда следует добавить код инициализацииbase.Initialize();}
Команда base.Initialize(); вызывает метод Initialise() базового класса. Сюда же добавляют команды для инициализации звуковой подсистемы игры, здесь же выполняются игровые настройки. Надо отметить, что в этом методе инициализируется все, кроме графических ресурсов игры. Для них существует метод LoadContent(), листинг 1.5.
Листинг 1.5. Код метода LoadContent()
1
2
3
4
5
6
7
protectedoverridevoid LoadContent(){ spriteBatch =new SpriteBatch(GraphicsDevice);// Сюда надо добавить код загрузки игровых ресурсов}
SpriteBatch – это класс, который позвляет выводить изображения на устройство, задаваемое параметром GraphicsDevice. В этот же метод добавляют команды для загрузки графических ресурсов, шрифтов. Метод UnloadContent() (листинг. 1.6.) предназначен для освобождения системных ресурсов.
Листинг 1.6. Код метода UnloadContent()
1
2
3
4
5
protectedoverridevoid UnloadContent(){// Код выгрузки игрвоых ресурсов}
Здесь размещают команды для выгрузки игровых ресурсов. В частности, в данном методе можно использовать команду base.UnloadContent(); - это метод базового класса, выгружающий ресурсы. Так же в этот метод добавляют команды для выгрузки шрифтов и других ресурсов.
Игровой цикл состоит из двух методов, выполняющихся циклически это методы Update() и Draw() – листинг 1.7.
Листинг 1.7. Код методов Update() и Draw()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protectedoverridevoid Update(GameTime gameTime){// Сюда следует добавить код игровых вычисленийbase.Update(gameTime);}protectedoverridevoid Draw(GameTime gameTime){ graphics.GraphicsDevice.Clear(Color.CornflowerBlue);// Сюда следует добавить код визуализации игровых объектовbase.Draw(gameTime);}
Сначала выполняется метод Update(), потом – метод Draw().
Команда base.Update(gameTime); метода Update() ответственна за организацию игрового цикла. Она снова и снова вызывает метод Update() базового класса. Именно эта команда является «двигателем» игры. Если её убрать – игровой цикл не будет работать. Параметр gameTime – представляет собой объект класса GameTime, который содержит информацию об игровом времени. Знание игрового времени нужно для организации взаимодействия внутри игры. По отношению к игровому времени можно выделить два типа игр. Первые – это игры реального времени, такие, как симуляторы. Вторые – это пошаговые игры, где игроку даётся некоторое время – фиксированное либо нет – для обдумывания следующего хода. Знание игрового времени нужно для многих игровых вычислений.
Класс GameTime имеет несколько важных свойств. Свойство ElapsedGameTime позволяет узнать время, которое прошло после последнего вызова игрового цикла. TotalGameTime – игровое время, прошедшее с момента старта игры. ElapsedRealTime – реальное время, прошедшее после последнего вызова игрового цикла. TotalRealTime – реальное время, прошедшее с момента старта игры.
Команда graphics.GraphicsDevice.Clear(Color.CornflowerBlue); метода Draw() очищает игровой экран, заливая его цветом CornflowerBlue. А команда base.Draw(gameTime); вызывает метод Draw() базового класса, который выводит на экран изображения. Поговорим о пространствах имен (компонентах), которые подключены к стандартному проекту по умолчанию. В листинге 1.8. приведены их вызовы.
Пространство имен Audio содержит инструменты для работы со звуком. Для работы со звуком в XNA существует утилита XACT (Microsoft Cross-Platform Audio Creation Tool). Подготовка музыки и звуков осуществляется с помощью этой утилиты, создаётся специальный XACT-проект, который загружается в игру. Применение XACT позволяет использовать одно и то же звуковое оформление как в Windows-играх, так и в Xbox360-играх.
Пространство имен Graphics представляет собой графическую часть XNA и содержит в себе средства для работы с графикой.
Пространство имен Input поддерживает работу со средствами ввода данных, в частности, это клавиатура, мышь и игровой манипулятор – джойстик. Как правило, при создании Windows-игр используют мышь и клавиатуру, при создании Xbox-игр – джойстик.
Пространство имен Storage содержит средства для работы с файловой системой. Именно инструменты из Storage позволяют, например, сохранять игровые данные в файлы, читать их и выполнять другие файловые операции.
Пространство имен Net поддерживает создание сетевых игр с помощью XNA. Реализация сетевого взаимодействия в XNA-играх осуществляется с помощью Windows LIVE.
Пространство имен Content содержит средства, обеспечивающие работу Content Pipeline. Content Pipeline – это очень важный механизм XNA Framework.
Пространство имен GamerService обеспечивает функции работы с сервисом LIVE – для игр под Xbox и Windows. Эти функции необходимы для создания сетевых игр. В частности, в GamerService находятся функции, позволяющие игроку регистрироваться для участия в игре, работать с информацией об игроке, хранить локальные пользовательские настройки для сетевых игр.
В разделе объявления свойств класса Game1 есть две переменных (листинг 1.9.).
Переменная graphics имеет тип GraphicsDeviceManager – она предназначена для управления графическим устройством, которое используется для вывода информации. Переменная spriteBatch имеет тип SpriteBatch – она нужна для вывода спрайтов на экран.
Вопросы
1) Какова роль файла Program.cs в игровом проекте?
a. Он является точкой входа в программу, после старта создает объект игры и запускает игру.
b. Он является одной из составных частей игрового цикла.
c. Он нужен для загрузки игровых ресурсов.
d. Он позволяет обрабатывать данные от устройств ввода информации.
2) Из каких методов состоит игровой цикл в стандартном проекте?
a. Update() и Main()
b. Main() и LoadContent()
c. Draw() и Initialise()
d. Update() и Draw()
3) Каким методом представлен конструктор класса Game1 в стандартном игровом проекте?
a. Initialise()
b. Game1()
c. Main()
d. Update()
4) Какой метод класса Game1 в стандартном игровом проекте предназначен для загрузки графических игровых ресурсов?
a. Initialise()
b. UnloadContent()
c. LoadContent()
d. Update()
5) Для того, чтобы освободить системные ресурсы, занятые игровыми данными, следует воспользоваться методом:
a. Initialise()
b. UnloadContent()
c. LoadContent()
d. Update()
6) Какой класс является родительским для класса Game1 стандартного игрового проекта?
a. Microsoft.Xna.Framework.GameComponent
b. Microsoft.Xna.Framework.Game
c. Microsoft.Xna.Framework.GameTime
d. Microsoft.Xna.Framework.GameWindow
7) В каком методе стандартного игрового проекта проводятся игровые вычисления?
a. Draw()
b. UnloadContent()
c. LoadContent()
d. Update()
8) В каком методе стандартного игрового проекта осуществляется вывод графических объектов?
a. Draw()
b. UnloadContent()
c. LoadContent()
d. Update()
9) Какие из перечисленных пространств имен содержат инструменты, благодаря которым можно создавать сетевые игры?
a. Microsoft.Xna.Framework.Audio
b. Microsoft.Xna.Framework.Content
c. Microsoft.Xna.Framework.GamerServices
d. Microsoft.Xna.Framework.Graphics
e. Microsoft.Xna.Framework.Input
f. Microsoft.Xna.Framework.Net
g. Microsoft.Xna.Framework.Storage
10) Какое из перечисленных пространств имен содержит средства для работы с устройствами ввода данных?
a. Microsoft.Xna.Framework.Audio
b. Microsoft.Xna.Framework.Content
c. Microsoft.Xna.Framework.GamerServices
d. Microsoft.Xna.Framework.Graphics
e. Microsoft.Xna.Framework.Input
f. Microsoft.Xna.Framework.Net
g. Microsoft.Xna.Framework.Storage
1536 Прочтений • [Введение в XNA Game Studio 2.0/3.0] [08.08.2012] [Комментариев: 0]