Мраморные лабиринты для восьмерки

 

Грэг Дункан

Сегодня мы займемся Мраморными лабиринтами … Как насчет проекта игры Marble Maze (Мраморные лабиринт), написанной с помощью C++, XAML, DirectX для Windows 8 MDL (Microsoft Design Language, известный также как Windows 8 Store App) и затем перенесенной на Windows Phone 8? И, конечно же, вы получите исходники обоих!

Пример игры Marble Maze с DirectX

Этот пример показывает, как собрать исходную 3D-игру, используя DirectX. Это простой лабиринт, в котором игрок должен прокатить мраморный шарик через лабиринт с ловушками, наклоняя устройство.

Рассматриваются следующие темы:

  • Встраивание Windows Runtime в игру DirectX для полной поддержки Windows Developer Preview
  • Использование DirectX для растеризации 3D-графики при выводе на дисплей
  • Реализация простых шейдеров вершин и текстур с помощью HLSL
  • Разработка простой физики и столкновений в игре DirectX
  • Оперирование со вводом от акселерометра, сенсорного экрана, мыши и игрового контроллера с помощью Windows Runtime и XInput
  • Проигрывание и смешивание звуковых эффектов и фоновой музыки с помощью XAudio2

Пример написан на C++ и требует некоторого опыта работы в области программирования графики и DirectX. Полную статью, рассматривающую данный код можно найти по ссылке Разработка Marble Maze – игры для Магазина Windows – с использованием C++ и DirectX.

Более подробно рассматриваемые в этом примере концепции и API описаны в следующих материалах:

..."

clip_image002

Пример Marble Maze для Windows Phone 8

Этот пример демонстрирует перенос игры Marble Maze на Windows Phone 8. Эта полнофункциональная игра демонстрирует использование Direct3D и Microsoft Media Foundation API.

Это приложение является переносом приложения Marble Maze из Windows Store. Все детали реализации оригинальной игры Marble Maze можно найти в разделе Разработка Marble Maze — игры для Магазина Windows — с использованием C++ и DirectX библиотеки MSDN. Windows Phone 8 поддерживает подмножество возможностей, доступных для приложений Магазина Windows. Поэтому при портировании в игру были включены несколько серьезных изменений. Детали приведены в этом документе ниже. Подробнее о создании игр для телефона можно прочитать в разделе Games for Windows Phone библиотеки MSDN.

Сборка примера

  1. Запустите Visual Studio Express 2012 для Windows Phone и выберите File > Open > Project/Solution.
  2. Перейдите в каталог, в который вы разархивировали пример. Щелкните дважды на файле решения Windows Phone (.sln).
  3. Нажмите Build > Rebuild Solution чтобы собрать приложение.

Запуск примера

  1. Чтобы запустить приложение и начать отладку нажмите F5 или Debug >Start Debugging. Чтобы запустить приложение без отладки нажмите Ctrl+F5 или Debug > Start Without Debugging.

Предупреждение:

При запуске примера в отладчике в первый раз может быть сгенерировано исключение первой возможности (first-chance exception). Это происходит из-за способа, которым Windows Phone Runtime API обрабатывают тот факт, что файла сохранения игры еще не существует. Можно просто скрыть эту ошибку, но это может привести к тому, что, возможно, будут скрыты и другие исключения, которые вызваны вашими модификациями кода, поэтому ошибка в данном примере не скрывается. Щелкните на кнопке «Continue» в диалоге об ошибке чтобы игнорировать исключение и продолжите нормальное выполнение программы.

Изменения, сделанные в примере MarbleMaze , позволяющие запустить его на WindowsPhone

Следующий список описывает изменения, которые были сделаны при портировании Marble Maze из Магазина Windows в Windows Phone. Там, где возможно, исходные файлы, в которых были сделаны соответствующие изменения, включены в список. Подробнее об особенностях разработки для телефона см. в статье «Differences in game development between the phone and the desktop».

  1. Прорисовка 2D -графики – Direct2D не доступен на Windows Phone. Версия игры Магазина Windows использует Direct2D для прорисовки 2D-гафики, вроде элементов GUI. Версия для телефона использует классы помощников (helper), поставляемые набором DirectX Tool Kit (DirectXTK) для реализации интерфейса игры. Исходные файлы: UserInterface.cpp, LoadScreen.cpp

Шрифт SpriteFont из DirectXTK используется вместо шрифтов Direct2D. Растровые шрифты заранее вычисляются до момента использования. Исходные файлы: MarbleMaze.cpp, UserInterface.cpp

  1. Загрузкатекстур – API Windows Imaging Component (WIC) не существуют для Windows Phone. Эти API позволяют загружать текстуры из файлов многих форматов. Версия для телефона использует текстуры DDS для загрузки экрана вместо изображений PNG.Исходные файлы: LoadScreen.cpp

Образы текстур уменьшены по сравнению с версий для настольной системы. Это сделано не по причине производительности, а для того, чтобы уменьшить размер приложения. Большие текстуры сильно увеличивают размер приложения, но не дают большую визуальную четкость изображения из-за небольшого размера экрана телефона. Исходные файлы: bridge.dds, bridge_bump.dds, floor_section1.dds, floor_section2.dds, walllevel1.dds.

  1. Direct3DAPI – Большинство функций, обеспечиваемых API телефона Direct3D, точно соответствуют своим настольным двойникам для поддерживаемого уровня возможностей (уровень возможностей 9_3). Единственным исключением является создание цепочки буферов. Есть несколько параметров инициализации, имеющих специальное требования в телефоне. Они включают:

swapChainDesc.BufferCount = 1;swapChainDesc.Scaling = DXGI_SCALING_STRETCH;swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

Код был найден в DirectXBase.cpp в строках 152-154.

Другие изменения в коде Direct3D включают в себя:

    • Убранный вызов IDXGISwapChain1::ResizeBuffers (DirectXBase.cpp)
    • Использование IDXGISwapChain1::Present1 вместо Present (DirectXBase.cpp)
    • Убранный ненужный размер окна и код управляющий изменением DPI. Этих событий нет в телефоне (DirectXBase.cpp, DirectXApp.cpp)
  1. Файловый ввод/вывод – В Windows Phone каталог LocalSettings не поддерживается. Класс PersistentState из настольной версии превратился в пользовательский метод SaveState. Исходный файл: MarbleMaze.cpp

FileIO не доступен в телефоне. Реализация была слегка изменена в BasicReaderWriter::ReadDataAsync и BasicReaderWriter::WriteDataAsync. Исходный файл: BasicReaderWriter.cpp

  1. Ввод – В игру добавлена поддержка кнопки «Назад» (BackPressed) и исключены события клавиатуры из-за отсутствия таковой. Исходные файлы: DirectXApp.cpp, MarbleMaze.cpp
  2. Audio – Из-за ограниченной поддержки API Microsoft Media Foundation API, была реализована загрузка пользовательских WAV-файлов. Исходный файл: MediaStreamer.cpp

Был модифицирован код проигрывания фоновой музыки для использования IMFMediaEngine. Исходный файл: Audio.cpp

clip_image004

Замечание: При запуске этого приложения в эмуляторе Windows Phone и использовании мыши, переключите ориентацию в портретный режим (Portrait Flat). Это поможет работать мыши, как вы ожидаете. (Так как предполагалось, что игра будет использоваться именно в такой ориентации).

Так как я принимал в этом году участие в подготовке //build/, то получил Surface RT и Nokia Lumia 920. Так что в моей мастерской Coding4Fun теперь есть ноутбук x86 (Alienware M11xr3 c Windows 8 x64), Surface RT (ARM) и Windows Phone 8 (тоже ARM).

Так будут ли эти приложения работать на этих двух устройствах? Конечно!

Вот снимки вышеупомянутых приложений, запущенных на этих устройствах. clip_image006clip_image008

Легко ли развернуть эти приложения на устройствах? Да; обычно, да. И слова «обычно, да» подразумевают один тонкий момент. Я не буду погружаться в детали развертывания и удаленной отладки приложений на этих устройствах, дам лишь совет более общего плана.

Surface RT

Находясь в Surface в Desktop IE, перейдите на страницу https://www.microsoft.com/visualstudio/eng/downloads, прокрутите ее до секции «Дополнительное ПО»(«Additional software») и в панели «Remote Tools for Visual Studio 2012» скачайте «Remote Tools for Visual Studio 2012 (ARM)"

clip_image010

После загрузки установите пакет.

После загрузки у вас появится новая плитка удаленного отладчика «Remote Debugger».

Запустите его и приложение на столе.

Теперь вернитесь на машину x86/x64, где запущена VS2012, измените целевой компьютер на Remote Machine:

clip_image012

Так как это проект C++, то надо сделать еще два дополнительных шага.

В свойствах проекта задайте имя машины, соответствующее устройству Surface RT. Этого не случится автоматически при нажатии F5. Соединения удаленного отладчика НЕ установятся при нажатии F5, как это случается с другими типами проектов. Поэтому вы должны здесь задать имя удаленной машины, и именно тогда соединения удаленного отладчика вступят в игру.

Если вы не зададите имя машины перед нажатием на F5, то получите следующую ошибку:

1>------ Deploy started: Project: MarbleMaze, Configuration: Release ARM ------
1>Error: Microsoft Visual Studio Remote Debugging Monitor cannot start without a Machine Name. Open project properties and specify a Machine Name under 'Configuration Properties -> Debugging'.

Так что задайте имя машины, отредактируйте и выберите свое устройство Surface RT.

clip_image014

Наконец, смените платформу с x86 на ARM

clip_image016

Жмите F5 и приложение должно выдать запрос на перекомпиляцию (поскольку устарело), оно будет развернуто и запущено на устройстве Surface. Также вы можете получить запрос Surface с просьбой подтвердить лицензию разработчика… Зайдите в учетную запись Microsoft и получите трехмесячную лицензию разработчика. Она бесплатна…

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

Windows Phone 8

Развертывание на Windows Phone 8 намного проще. Подключите телефон через USB, выберите «Device» в качестве целевой машины:

clip_image018

Убедитесь, что телефон не заблокирован ( переключатель «Заблокировать экран» не включен) и нажмите F5.

Если я правильно помню, меня также спросили про лицензию разработчика во время этого, но теперь она распространяется на мой ноутбук, а не на устройство.

В любом случае, это так. Windows Phone SDK достаточно умен, чтобы автоматически переключить платформу на ARM (что понятно, так ка каждое устройство Windows Phone 8 работает на ARM, в то время как Surface может быть на ARM или Intel).

Итог

Теперь у вас есть два проекта, исходные коды для каждого, руководство, как модифицировать приложение Магазина Windows, чтобы оно работало на Windows Phone 8, и, наконец, как загрузить приложения в ожидающие их устройства… Этого достаточно, чтобы занять вас на пару следующих дней?