| Невозможно пройти тесты, в окне с вопросами пусто |
Введение в XNA, знакомство с проектом, первое приложение
7.2. Разбор кода стандартного игрового проекта
В листинге 7.1 приведено содержимое файла Program.cs.
using System;
namespace P2_1
{
#if WINDOWS || XBOX
static class Program
{
/// <summary>
/// Главная точка входа приложения.
/// </summary>
static void Main(string[] args)
{
using (Game1 game = new Game1())
{
game.Run()>;
}
}
}
#endif
}
Листинг
7.1.
Код файла Program.cs
Этот файл применяется для запуска игры в том случае, если она разрабатывается для платформ Xbox или Windows, при запуске на Windows Phone данный файл не используется.
Второй программный файл, Game1.cs, представляет собой игровой проект, который и содержит все то, что используется при создании игры. Естественно, в сложных игровых проектах основная часть кода выносится за пределы данного файла, но он, в любом случае, является центром игры.
Упрощенно структуру игрового проекта можно представить так (Табл. 7.1.).
В стандартном игровом проекте все эти этапы представлены с помощью специальных методов. Эти методы унаследованы созданным игровым проектом от класса Game, который служит основой для проекта. Итак, это следующие методы (табл. 7.2.).
Теперь, когда мы ознакомились с типичной структурой игры и назначением стандартных методов, рассмотрим код класса Game (Листинг 1.2). Помимо программного кода здесь приведены комментарии, включаемые в код автоматически.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace P2_1
{
/// <summary>
/// Это главный тип игры
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds(1);
}
/// <summary>
/// Позволяет игре выполнить инициализацию, необходимую перед запуском.
/// Здесь можно запросить нужные службы и загрузить неграфический
/// контент. Вызов base.Initialize приведет к перебору всех компонентов и
/// их инициализации.
/// </summary>
protected override void Initialize()
{
// ЗАДАЧА: добавьте здесь логику инициализации
base.Initialize();
}
/// <summary>
/// LoadContent будет вызываться в игре один раз; здесь загружается
/// весь контент.
/// </summary>
protected override void LoadContent()
{
// Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
spriteBatch = new SpriteBatch(GraphicsDevice);
// ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
}
/// <summary>
/// UnloadContent будет вызываться в игре один раз; здесь выгружается
/// весь контент.
/// </summary>
protected override void UnloadContent()
{
// ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
}
/// <summary>
/// Позволяет игре запускать логику обновления мира,
/// проверки столкновений, получения ввода и воспроизведения звуков.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Update(GameTime gameTime)
{
// Позволяет выйти из игры
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// ЗАДАЧА: добавьте здесь логику обновления
base.Update(gameTime);
}
/// <summary>
/// Вызывается, когда игра отрисовывается.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// ЗАДАЧА: добавьте здесь код отрисовки
base.Draw(gameTime);
}
}
}
Листинг
7.2.
Код файла Game1.cs
Рассмотрим каждый из приведенных выше методов. В листинге 7.3. приведен код метода Game1().
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds(1);
}
Листинг
7.3.
Код метода Game1()
В классе Game есть, по умолчанию, два поля. Это поле graphics, которое имеет тип GraphicsDeviceManager и представляет графические элементы, и поле spriteBatch с типом SpristeBatch, представляющее пакет спрайтов (изображений).
Метод Game() – это конструктор класса Game. Команда graphics = new GraphicsDeviceManager(this);
создает новое игровое окно, а объект graphics используется для проведения различных графических операций. Например, с помощью этого объекта можно настраивать параметры окна.
Команда Content.RootDirectory = "Content"; позволяет указать место (в нашем случае – это проект P2_1Content, или просто Content), где хранятся игровые ресурсы. Content.RootDirectory следует понимать как свойство Content (Содержимое) типа ContentManager (Диспетчер содержимого), RootDirectory (Корневой каталог) – это свойство данного класса.
Команда TargetElapsedTime = TimeSpan.FromTicks(333333); задает время игрового цикла, ориентируясь на частоту обновления экрана в устройствах на Windows Phone. Это – 30 кадров в секунду. Наш игровой цикл, таким образом, будет выполняться 30 раз в секунду.
Помимо описанных команд, автоматически включаемых в стандартный игровой проект, конструктор может содержать и другие команды. Например, команды дополнительной настройки объекта graphics.
После того, как создан экземпляр класса Game, вызывается метод этого класса Run, после чего выполняется инициализация игры, загрузка контента, запускается игровой цикл.
В листинге 7.4. приведен код метода Initialise().
protected override void Initialize()
{
// ЗАДАЧА: добавьте здесь логику инициализации
base.Initialize();
}
Листинг
7.4.
Код метода initialise()
Команда base.Initialize(); вызывает метод Initialise() базового класса. Сюда же добавляют команды для инициализации звуковой подсистемы игры, здесь же выполняются игровые настройки. Надо отметить, что в этом методе инициализируется все, кроме графических ресурсов игры. Для них существует метод LoadContent(), листинг 7.5.
>protected override void LoadContent()
{
// Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
spriteBatch = new SpriteBatch(GraphicsDevice);
// ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
}
Листинг
7.5.
Код метода LoadContent()
SpriteBatch – это класс, который позволяет выводить изображения на устройство, задаваемое параметром GraphicsDevice. В этот же метод добавляют команды для загрузки графических ресурсов, шрифтов. Метод UnloadContent() (листинг 7.6.) предназначен для освобождения системных ресурсов.
protected override void UnloadContent()
{
// ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
}
Листинг
7.6.
Код метода UnloadContent()
Здесь размещают команды для выгрузки игровых ресурсов. В частности, в данном методе можно использовать команду base.UnloadContent(); - это метод базового класса, выгружающий ресурсы. Так же в этот метод добавляют команды для выгрузки шрифтов и других ресурсов.