Статьи

Основные моменты разработки XNA на Windows Phone 7

Разработка игр для нескольких платформ может оказаться сложной задачей, когда речь идет о переносе одного и того же проекта на другую систему при сохранении его возможностей. С тех пор, как Microsoft выпустила платформу XNA, эта задача была упрощена, и разработчики, создавшие продукты для платформ Microsoft, смогли создать одну игру, а затем скомпилировать ее для нескольких платформ (Xbox 360, Windows, Zune) с небольшими изменениями кода или без изменений. Такая же простота теперь доступна для тех, кто планирует разрабатывать игры для Windows Phone 7. XNA Framework также доступна на этой платформе, предоставляя разработчикам доступ ко многим уникальным функциям телефона, таким как акселерометр или GPS.

Все начинается с установки SDK . XNA Game Studio является составной частью и будет автоматически загружаться и устанавливаться вместе со всеми другими инструментами разработки для Windows Phone 7. Конечно, вы также можете скачать его как отдельный пакет . Когда вы будете готовы, если вы откроете Visual Studio 2010, вы увидите, что доступно множество новых типов проектов:

После создания тестового проекта основные структуры кода абсолютно одинаковы в любой другой игре XNA:

Однако одно важное отличие заключается в том, что теперь у вас есть очень строгие требования к оборудованию. Windows Phone 7 даже не близок по производительности как к ПК, так и к Xbox 360, поэтому вы должны быть очень осторожны с распределением объектов и сложной графикой.

Предполагая, что вы уже знакомы с основами разработки XNA, вы знаете, что по умолчанию в игровом классе есть пять методов:

  • Initialize
  • LoadContent
  • UnloadContent
  • Обновить
  • Привлечь 

Метод Initialize запускается в момент запуска игры на устройстве. Это фундаментальная отправная точка, и, как правило, разработчик не должен вмешиваться в процесс инициализации. LoadContent предназначен для того, чтобы позволить разработчику загружать дополнительные ресурсы контента, такие как текстуры, чтобы иметь возможность использовать их позже в игре. UnloadContent, с другой стороны — метод, который позволяет вам утилизировать использованный контент.

Update и Draw — это, на мой взгляд, два самых интересных метода. Обновление постоянно запускается во время выполнения игры — здесь вы можете проверить пользовательский ввод и определить поведение определенных игровых элементов в зависимости от состояния игры. Во время загрузки игры также постоянно выполняется ничья, но ее основное назначение — рисовать игровые элементы в зависимости от текущего игрового состояния.

Давайте посмотрим на это в действии, когда я хочу отслеживать жесты пользователя. В отличие от Xbox 360 и ПК, Windows Phone 7 использует сенсорный ввод. Платформа XNA Framework 4.0 поставляется с новым пространством имен —  Microsoft.Xna.Framework.Input.Touch . По умолчанию сенсорные жесты не обрабатываются. Чтобы изменить это, в игре конструктор класса я определяю , что мне нужно отслеживать, установив EnabledGestures свойство TouchPanel класса.

Игры XNA имеют другую структуру по сравнению с приложениями Silverlight. В обычном клиентском приложении есть страницы, которые могут быть конкретными сенсорными панелями ввода. В игре XNA есть один экран, который напрямую не обрабатывается разработчиком. Поэтому TouchPanel является статическим классом, который управляет сенсорным вводом для всей игры.

Сенсорная панель может отслеживать 11 типов жестов. Я не буду документировать их здесь , так как официальная документация довольно подробно по этой теме . Как я уже говорил, я могу объявить необходимые жесты в конструкторе классов:

public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);
TouchPanel.EnabledGestures = GestureType.VerticalDrag | GestureType.Tap | GestureType.PinchComplete | GestureType.Pinch
| GestureType.HorizontalDrag | GestureType.Hold | GestureType.FreeDrag | GestureType.Flick;
}

Здесь я указываю, что есть несколько типов жестов, которые я хочу отслеживать, и это может служить различным целям в игре. Например, вертикальное перетаскивание может нарисовать траекторию для шара, а удержание может вызвать экранное меню. 

После установки я могу отслеживать выполнение определенных жестов в методе Update:

protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();

if (TouchPanel.IsGestureAvailable)
{
if (TouchPanel.ReadGesture().GestureType == GestureType.VerticalDrag)
{
Debug.WriteLine("There was a vertical drag!");
}
}

base.Update(gameTime);
}

Прежде всего я проверяю, доступен ли жест, и если да, мне нужно проверить тип жеста.

Теперь, когда вы знаете, как обрабатываются основные жесты, давайте применим эту функциональность и в то же время узнаем о другой специфической для XNA функции — возможности доступа к библиотеке мультимедиа. Будет справедливо лишить конечного пользователя возможности хранить на своем устройстве какой-либо мультимедийный контент — например, песни. 

Вся библиотека мультимедиа предоставляется разработчику через класс MediaLibrary . В моем игровом проекте я хочу получить доступ к определенной песне и воспроизвести ее, когда пользователь удерживает палец на экране (запускает жест удержания). У меня уже есть базовая структура, доступная в UpdateMethod, и все, что мне нужно сделать, это изменить тип жеста, который я проверяю.

if (TouchPanel.IsGestureAvailable)
{
if (TouchPanel.ReadGesture().GestureType == GestureType.Hold)
{

}
}

Как только жест обнаружен, мне нужно создать экземпляр класса MediaLibrary:

MediaLibrary lib = new MediaLibrary();

Этот класс имеет дополнительный конструктор, который принимает экземпляр MediaSource в качестве параметра. Если разрабатываемый вами телефон не имеет внешнего хранилища (например, SD-карты), то все, что у вас есть, — это библиотека локальных устройств .

ПРИМЕЧАНИЕ. Для проверки возможностей MediaLibrary вам необходимо физическое устройство Windows Phone 7. Вы можете проверить основные функции в эмуляторе, но для доступа к звуковым и видео носителям вам потребуется телефон.

Вы можете легко проверить доступные устройства хранения с этим фрагментом кода:

IList<MediaSource> q = MediaSource.GetAvailableMediaSources();
foreach (MediaSource n in q)
Debug.WriteLine(n.Name);

Локальное хранилище устройства используется по умолчанию, если оно не определено явно. Поскольку у меня уже подключен телефон, я хочу найти песню и воспроизвести ее. Экземпляр MediaLibrary может предложить доступ к следующему контенту на устройстве:

  • Альбомы
  • Художники
  • Жанры
  • Картинки
  • Плейлисты
  • песни
  • SavedPictures

И хотя воспроизведение контента, указанного здесь, требует активации стандартного системного медиа-слоя (например, песен), это дает разработчику большую свободу относительно того, что вы можете делать с медиа-файлами. По понятным причинам вы не можете редактировать медиа-контент, но вы можете получить к ним доступ.

Например, я хочу получить первую песню из моей коллекции транса. Я использую стандартный запрос LINQ и вызов статического класса MediaPlayer , специально разработанного для воспроизведения песни.

Song n = (from c in lib.Songs where c.Genre.Name == "Trance" select c).First();
MediaPlayer.Play(n);

Это хороший способ добавить некоторые медиа взаимодействия в игру. Таким же образом вы можете получить обложку альбома и дополнительную медиа-информацию, сохраненную в тегах ID3. Я не рекомендовал бы злоупотреблять такого рода функциями, потому что пользователи не хотят, чтобы доступ к медиа-контенту осуществлялся без их согласия.

В платформе XNA Framework есть еще много всего, кроме уровня абстракции, который он предлагает поверх мобильной платформы. При работе с XNA для разработки мобильных приложений будут введены дополнительные ограничения — например, вы не можете использовать собственные шейдеры. Для большинства игр, которые вы собираетесь разрабатывать, это не является критической необходимостью и было удалено из соображений производительности. Как разработчик, вы должны понимать, что отсутствующая функциональность отсутствует по определенной причине. Производительность мобильного оборудования постоянно улучшается, поэтому по мере того, как производители телефонов продолжают вводить новшества, будет доступно больше функций.

Вообще, я не вижу разницы в разработке игр XNA на WP7 по сравнению с любой другой платформой, которая поддерживает эту платформу. Прежде чем активно разрабатывать продукт, я бы порекомендовал проверить этот документ .

Очень хорошим ресурсом для проверки разработки XNA является образовательный портал AppHub .