Мы, команда программистов из украинской софтверной компании, хотим поделиться приобретенным опытом с уважаемыми читателями Хабра. Сейчас в режиме добровольного повышения квалификации ведем разработку игрушки для Windows 8 и в этой задаче все для нас ново: ОС, создание игровых приложений, физика и графика для игр. Чтобы наши поиски, познания и результаты были максимально полезными, мы решили опубликовать на всеобщее обозрение цикл статей-отчетов о процессе разработки. Мы искренне надеемся на диалог с читателями и на то, что описанная нами информация будет полезна и интересна.
Сегодня публикуем стартовую вводную статью о том, как нам пришла идея, какие цели мы ставим, и к чему идем.
Как все начиналось…
Мы решили провести Coding Dojo и выбрали 3D игрушку, сначала это были 3D танки. Проведя 3-4 занятия нам явно стало не хватать организованности и каждый раз мы все сильнее увлекались отдельными задачами. В итоге пришли к самообучению: каждый сидел и писал сам себе.
Но мы сделали 2 важных вывода:
Coding Dojo – это классно, но и тут должна быть организация и лидер (позже мы вернемся к проведению этих сессий)
Создание игрушек — это очень увлекательно и интересно; на фоне разработки корпоративных приложений это была свежая струя, которая нам была очень интересна. Многое было в новинку: векторы, матрицы, кватернионы, вершины, индексы, текстуры и т.д.
Теперь стоит сказать отдельное спасибо руководству нашей компании, которое поддержало нашу идею о создании игрушки и дало отмашку на старт этого эксперимента.
Что мы будем писать…
Писать мы должны были под Windows 8, так как практическое освоение разработки под эту ОС было одним из условий нашего самообучения. После перебора идей для игры мы опросили многих своих коллег, перебрали варианты и вспомнили про… Колобка. И так, мы решили создать детскую игрушку с рабочим названием «Приключения Колобка».
Сюжет прост: путем нехитрых манипуляций с планшетным ПК нужно провести Колобка по сказочному лабиринту, где на пути его встанут разные преграды и препятствия.
Наши инструменты:
С# 5.0, .Net for Windows Store apps
Bullet (слегка переделанный под С#), SharpDX, DirectX 11
вдохновение, опыт, мозги и руки пяти человек (два девелопера, team lead, дизайнер и художник)
С чего мы начали…
Идея о публикации процесса разработки пришла к нам, к сожалению, не сразу, поэтому на данный момент мы уже выполнили некоторый перечень задач:
проработки идей для игрушки;
разработка архитектуры;
знакомство с DirectX;
знакомство с SharpX;
знакомство с HLSL;
поиск физического движка, обертка под С#, знакомство с движком;
структура проекта;
работа с выводом на экран примитивных объектов;
работа с физикой простых объектов;
работа с шейдерами (эффекты, свет и тени)
Проектирование
Архитектура приложения разделена на два уровня: абстрактный и уровень реализации. Разделение на уровни способствует повторному использованию кода, расширению и сопровождению. Уровень абстракции включает четыре базовые понятия: «Игра», «Физика», «Логика» и «Визуализация». На этом уровне описаны основные принципы взаимодействия этих компонентов:
«Игра» объединяет в себе все остальные и здесь заложены основные принципы самой игры (старт игры, пауза, проигрыш, выигрыш и т.д.);
«Физика» — программный компонент, который описывает взаимодействие игровых объектов между собой с физической точки зрения: обработка столкновений объектов, расчет сил гравитации, скоростей;
«Логика» — это компонент, который управляет игрой не обращая внимание на физическое взаимодействие объектов. Здесь описаны правила верхнего уровня для игры: расчет каких-либо бонусов, принятие решения о победе, проигрыше, нефизическое взаимодействие предметов (например, при столкновении персонажа с предметом: предмет исчезает и насчитываются бонусы);
«Визуализация» — один из самых простых компонентов абстрактного уровня, который описывает понятие визуализаторов, умеющих рисовать объекты игрового мира.
Уровень реализации в нашем варианте создает конкретные компоненты игры, физику, логику и визуализацию. Здесь учитывается специфика нашей задачи: приложение под Windows Store и особенности игры.
Физика
Физика реализована с помощью Bullet Physics – движка для обработки физического взаимодействия игровых объектов. Физический движок, в принципе, можно написать и самостоятельно с нуля, используя существующие алгоритмы и решения, если необходимы какие-то уникальные физические условия, а так же достаточно времени и опыта. В нашей игре есть уникальные физические условия: мы симулируем модель мира, в которой вектор гравитации остается неизменным, а земля (ground) меняет свой наклон по отношению к вектору гравитации (параллельно мы обдумываем реализацию игрового мира с изменением вектора гравитации ). Есть такая реальная детская игра, в которой шарики нужно загнать в определенное место проходя лабиринт. Лабиринт наклоняют в разные стороны, шарик при этом катится и нужно попасть в нужные проходы. Но так как опыта написания такого рода приложений не было и времени тоже было немного, мы решили поискать готовые решения и применить их для данной задачи. После некоторого перебора немногочисленных вариантов мы остановились на переписанном под платформу XNA на C# популярном bullet-движке (http://code.google.com/p/bullet-xna/). Следует отметить, что движок переписан не полностью, часть функционала отсутствует, но и реализованного вполне достаточно. Нам пришлось удалить все привязки в коде к платформе XNA и убрать полностью отрисовку отладочной информации.
Визуализация
Выбор инструментов визуализации был сделан на основе проведенного обзора возможных вариантов для создания игры в управляемом коде:
XNA не поддерживается в Windows Store — даже были обнаружены такие статьи, которые говорили что XNA прекратит свое существование;
Monogame это опенсорс реализация XNA, а поддержка Windows 8 сейчас находится на стадии разработки (возможно, мы и будем использовать в будущем Monogame вместе с SharpDX);
SlimDX — старше чем SharpDx, и лучше задокументирован, чем SharpDX, но сейчас он не поддерживает DirectX 11.1;
SharpDx — поддерживает DirectX 11.1, обновляется намного чаще чем SlimDX, а также судя по тестам (http://code4k.blogspot.com/2011/03/benchmarking-cnet-direct3d-11-apis-vs.html) быстрее чем SlimDx.
Поэтому мы решили использовать чистый SharpDx без всяких движков в качестве управляемой обертки над DirectX и создали подобие своего собственного игрового движка.