В минувшие выходные в Москве на Берсеневской набережной в Lightbox Studio Red October прошел организованный компаниями Intel, Samsung и FRUCT хакатон, посвященный разработке приложений под платформу Tizen.
Наша молодая (но очень перспективная!) команда FriedCroc приняла участие в этом замечательном мероприятии. Да и не просто приняла, а еще и заняла первое место! Мы решили рассказать об этом сообществу, поделиться накопленным опытом и выложить исходники нашего прототипа.
Наш проект
Почему 2D гоночки в космосе? Некоторое время назад мы выложили в AppStore несколько игр. Одна из них посвящена кроликам, которые воруют морковки с фермерских угодий. А поскольку кролики – это не только ценный мех, то они были благополучно запущены в космос собирать там морковки и уклоняться от астероидов. В итоге каждый занят своим делом: Samsung запускает Tizen для землян, а FriedCroc запускает кроликов в космос.
Как и положено любому участнику хакатона, у нас были грандиозные планы. Мы хотели сделать гонку с соперником, апгрейд ракеты, подбираемые бусты и тому подобные интересные штуки. Мы их, конечно же, сделаем перед тем как выложить игрушку в Tizen Store, но в прототипе всего этого удовольствия нет. Мы даже не успели сделать звуковые эффекты, хотя и планировали.
Tizen
Наше знакомство с платформой Tizen произошло не на самом хакатоне, а за неделю до него, на финале хакафона MDDay в Яхроме, где мы тоже участвовали (но, к нашему разочарованию, ничего не выиграли). Платформа Tizen еще сыровата и далека от совершенства, и мы имели удовольствие наступить на некоторые грабли еще в Яхроме. К счастью, Samsung на каждое мероприятие присылает великолепных менторов, которые сутками на пролет готовы решать проблемы разработчиков. Эти ребята не сдаются, пока не найдут решение, за что им огромное спасибо. А проблем было прилично: у нас не запускался эмулятор, не работало одно из тестовых устройств (его пришлось перепрошивать), были сложности с настройкой проекта. В итоге мы потратили где-то 4 часа на решение этих проблем. Зато к хакатону в Красном Октябре мы уже подошли во всеоружии.
Итак, с платформой мы были немножко знакомы. Тестовые устройства у нас тоже уже были (мы ими разжились в Яхроме, причем совершенно бесплатно: потребовалось только подписать обязательство эти устройства не продавать). Казалось бы, какие еще сложности могут возникнуть?
Eclipse vs CLI
Tizen SDK использует Eclipse в качестве среды разработки. Они объясняют это тем, что для Eclipse легко писать плагины.
У всех программистов FriedCroc был опыт работы с Eclipse, и всех нас, без исключения, от него тошнит. В основном – из-за его глючности (чего стоят одни только «зависающие» маркеры синтаксических ошибок в файлах, которые лечатся исключительно перезапуском среды).
Именно поэтому, когда мы узнали, что в Tizen SDK есть утилиты для работы с проектами из командной строки, мы однозначно решили разрабатывать с помощью этих утилит. Однако, как оказалось, консольные инструменты довольно сырые. Например, Makefile, который генерируют эти утилиты, требует расположения всех исходников в одной директории и не поддерживает вложенные поддиректории. Кроме того, документации по этому способу сборки практически нет: не понятно, как добавить флаги компилятора, как указать директорию с исходниками и т.п.
В итоге мы все-таки использовали Eclipse-проекты: они поддерживают поддиректории, позволяют задавать define’ы и другие флаги компилятора и умеют еще кучу всего, чего не умеют консольные утилиты.
С++11
Мы пишем игры на С++. Более того, мы пишем игры на С++11. Свежая версия языка имеет кучу плюшек, которые уменьшают количество кода и ускоряют разработку. Тем более, что на дворе уже 2014 год и все mainstream-компиляторы уже подтянулись хотя-бы до 80% поддержки этого стандарта.
К величайшему нашему разочарованию, Tizen SDK содержит очень старую версию GCC и libstdc++ (4.5), поэтому нормальной поддержкой C++11 там даже и не пахнет. По этой причине в Яхроме мы писали наш проект на C++98.
Естественно, мириться с таким положением дел мы не собирались, поэтому стали искать способ собрать код на C++11 под Tizen. Во-первых, нам повезло, что в Tizen SDK также входит компилятор clang. И хоть он тоже весьма древний, он таки понимает C++11, пусть и выпадает периодически в корку. Проблему отсутствия поддержки C++11 на уровне библиотек (в Tizen SDK старый libstdc++) мы решили очень просто: взяли свеженькие исходники libc++ из clang и положили в наш проект. После внесения небольших правок и добавления пары define’ов в проект, libc++ благополучно собралась, чему мы были несказанно рады.
Кстати, чтобы код собирался в режиме C++11, компилятору нужно добавить флаг –std=c++11. К сожалению, если отредактировать список флагов компилятора в Eclipse, то он будет перезатерт при следующей сборке (инженеры Samsung, возьмите на заметку!). В итоге, пришлось воспользоваться полем «Other optimization flags», которое, в общем-то предназначено для других целей. Но зато оно не перезатирается при сборке и флаг доходит до компилятора.
Хватит о Tizen, поговорим о проекте
Мы использовали Box2D для физики. В проекте есть debug draw (который отключается только в релизной сборке). Не удивляйтесь, что кораблик имеет четыре «колеса» — мы взяли за основу какой-то сэмпл с интернета, там были машинки :)
Управление сделано очень просто: экран поделен по вертикали на три части; нажатие в левой части делает поворот влево, в правой – вправо, а центральная часть не используется.
Здесь стоит отметить, что нам очень понравилась идея, реализованная в Angry Birds Go, когда машинка «старается» ехать в нужном направлении даже если игрок ею не управляет. Поэтому в нашей игрушке кораблик тоже старается следовать по маршруту, хоть и не очень успешно, если ему не помогать.
Картинку мы рисуем обычным OpenGL ES 2.0. Мы даже не пытаемся отбрасывать невидимую геометрию (это же хакатон, в конце концов :). К нашему счастью, тестовый девайс вполне справляется с этим неэффективным кодом и выдает играбельный FPS.
Кстати, вот скриншоты того, что у нас получилось:
С debug-отрисовкой:
Редактор уровней
Уровни в игре описываются простым XML-файлом. Чтобы не писать его от руки, в рамках хакатона мы написали очень простой редактор уровней на Groovy. Его исходники мы пока публиковать не будем, но если вдруг вам очень интересно, пишите, что-нибудь придумаем :)
Ресурсные файлы
Мы не успели разобраться с механизмом ресурсов в Tizen. Чтобы не рисковать (время на хакатоне весьма ограничено), мы написали небольшую тулзу, которая перегоняет ресурсные файлы в C++-массивы.
Исходники
Исходники игры доступны на github: github.com/friedcroc/tizen_spacerace под очень либеральной лицензией (MIT), так что пользуйтесь. Код там местами хакатоновский (минимум оптимизаций, куча каких-то захардкоженных параметров и тому подобные безобразия), но вполне читаемый. Картинки заменены на упрощенные черно-белые, не обижайтесь :)
Еще раз немножко о нас
Мы молодые, прогрессивные, перспективные и просто классные! Нам очень нравится делать игры, чем мы успешно и занимаемся. Иногда еще и мобильные приложения делаем :)
Если есть желание ознакомиться с нашими играми в AppStore, ссылки на них можно найти на нашем сайте. А какой у нас сайт, я надеюсь, вы догадаетесь :)
За сим позвольте мне откланяться, всем спасибо за внимание!
Автор: nikolayz