Udostępnij za pośrednictwem


Windows Phone, физика и пираты!

Грэг Дункан

Сегодняшний проект посвящен небольшой интересной игре для WindowsPhone , позволяющей объединить физику и пиратов. Как стала возможной эта комбинация?

Пираты для Windows Phone

clip_image002

Содержание

  • Введение
  • Системные требования
  • Движок физики Farseer
  • Настройка игры на 60 кадров в секунду
  • Преобразование изображений в физические объекты
  • Цикл ручного ввода
  • Цикл обновления
  • Цикл прорисовки
  • Последние соображения
  • История

Введение

Эй, на палубе! В этой статье мы представляем игру для Windows Phone (или, по крайней мере, начало игры…) и надеемся получить много забавного от нее в конце. Но за забавами лежат основополагающие технологии, необходимые для ее построения. Я расскажу о них поэтапно и, надеюсь, вам будет интересно до самого конца статьи.

"Пираты!" для Windows Phone – это игра, написанная на C# и XNA, и использующая движок физики Farseer Physics Engine. Идея игры возникла, главным образом, благодаря игре «Angry Birds» компании Rovio, которой мы отдаем должное, и которая к концу 2011 года была скачана более 500 миллионов раз. «Angry Birds» привлекает многих людей по всему миру, но мне не столько нравится в нее играть, сколько искать компоненты, необходимые для создания подобной игры.

Вместо птиц – пушка полная снарядов. Вместо свиней – большой пиратский корабль, полный пиратов. Ваша задача – нацеливать пушку, чтобы перебить всех пиратов.

Предупреждение. Эта история не имеет ничего общего с имеющими сейчас место баталиями вокруг актов SOPA (Stop Online Piracy Act) и PIPA (Protect IP Act).

Короткое видео даст вам представление о том, что я говорил:

Одна простая вещь стала очевидной для меня, – это как автор обходит некоторые узкие места, чтобы помочь улучшить скорость кадров движка Farseer .

Движок физики Farseer

Farseer – удивительный движок физики с открытым исходным кодом, основан на оригинальном проекте с открытым исходным кодом Box 2D (кстати, игра Angry Birds использует Box2D). Разница между ними состоит в том, что Box2D написан на С++ (и был портирован на многие языки), а Farseer сделан на C#, имея целью Silverlight и XNA. Кроме того, на сайте проекта Farseer утверждается, что движок имеет множество других возможностей, отсутствующих в исходном Box2D.

Настройка игры на 60 кадров в секунду

Чтобы достигнуть максимальной частоты кадров (около 60 кадров в секунду), обеспечиваемой WP Mango, необходимо поменять исходный код Farseer, который вы загрузили, следующим образом:

  1. Дважды щелкните на решении «Samples XNA WP7». Выберите пункт «Upgrade Windows Phone Projects...» чтобы обновить их все до последней версии Windows Phone 7.5 Mango.
  2. В конструктор класса игры добавьте следующий обработчик событий:
  3. ...

Статьяпродолжаетсяотсюдачерез все главные области:

Преобразование изображений в физические объекты

Все динамические объекты создаются из текстурных изображений. Это очень приятная черта движка Farseer, намного упрощающая жизнь. Встроенные функции движка создают цельный объект из плоского изображения нашего лабиринта, обеспечивающие пустые места с прозрачными цветами, подобно этому:

...

Цикл ручного ввода

Цикл ручного ввода сделан видимым в движке Farseer Engine и позволяет регистрировать и управлять жестами пользователя.

Этот метод отвечает за:

  • Регистрацию движений левого джойстика и их преобразование в движения пушки.
  • Регистрацию нажатий на правую кнопку "A" и выстрел пушки.
  • ...

Цикл обновления

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

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

Цель класса Update следующая:

  • Вычислить новое положение облака. Всего есть три слоя облаков и каждый движется с собственной скоростью.
  • Сменить внешний вид моря, выбрав одну из четырех существующих текстур.
  • Сдвинуть камеру в соответствии с изменением состояния игры (в начале игры камера показывает пиратский корабль, затем она сдвигается на ваш).
  • Обновить положение камеры в соответствии с траекторией, описываемой пушечным ядром. Полезно сохранять все действия игры.
  • При необходимости управлять увеличением камеры.
  • И, наверное, самое важное – для обновления положения пушечного ядра (вместе с дымным шлейфом, остающимся при полете).
  • ...

Цикл прорисовки

Цикл прорисовки вызывается XNA когда наступает время перерисовать кадр. Мы заменили этот метод перерисовки всех кадров нашей игры.

  • Этот цикл управляет всей представительской частью игры:
  • Он рисует фоновые текстуры
  • Он рисует небо, облака, море и корабли
  • Он рисует пушечное ядро, пушку и дымные следы
  • Он рисует пиратов и другие объекты на экране
  • Он рисует текущие баллы и максимально набранные баллы
  • ...

Давайте взглянем на решение (которое с первого раза запустилось, и было развернуто в эмуляторе без проблем);

clip_image004clip_image006

Код проекта игры легко доступен, и его большая часть собрана в одном месте – в файле PirateDemo.cs.

clip_image008

На данный момент игра не закончена, но она – прекрасная стартовая точка и даже в таком состоянии с ней приятно поиграть и, что лучше всего, она покрывает ряд важных вещей, таких как движок физики, управление состоянием игры и т. п.

Если вы подумываете о написании собственных подобных игр, эта статья и код – хорошее начало вашего путешествия…