Раннер под iOS с пятью персонажами

    Привет, хабр!

    Так случилось, что я довольно давно занимаюсь разработкой под iOS, но вот незадача — никогда не писал игры. После змейки в 13 лет под IBM 386 наступил перерыв до 2014 года, когда я набрался сил воплотить теплую ламповую мечту в реальность. Что из этого получилось? Графика сводилась так:



    А геймплей хотелось сделать похожим на это:


    Если интересно, прошу под кат! (много картинок!)

    Проект некоммерческий, без пурчейзов, рекламы и смс, да и на текущей стадии напоминает скорее концепт. Возможно, читателям хабра знакома вторая картинка — одним прекрасным днем я увидел ее в этом посте, да-да, восторженные комментарии мои. Сначала немного слов про графику.

    Графика


    Я, к счастью или к сожалению, обычный программист и рисую довольно жалко, поэтому пришлось искать художника. А какой бюджет может предложить женатый мужчина для своей развлекалочки? Ну, оказалось в итоге около $1000, но конечно же этого не хватило бы на профессионального гейм-художника, поэтому спустя какое-то время вышел на девочку, которая весьма неплохо рисует в акварели, но фотошоп не видела в глаза. Начали с фона и, так как я всегда хотел сделать хоррор, жутких деревьев. Сканы вышли такими (картинки кликабельны):





    Последний скан — платформа — так вообще напомнила мне чем-то первый StarCraft по цветовой схеме. И так мне эта акварель понравилась, что я решил не переводить её в вектор и оставить как есть, вырезав и маленько подретушировав в фотошопе. В итоге из множества эскизов в игре появилось 13 видов деревьев, 2 вариации платформ и 5 персонажей, за которых предлагается одновременно играть игроку. В бумаге это выглядит так:



    C персонажами получилось сложнее. Из многих-многих вариантов деток мы выбирали очень долго. Первоначально я даже не знал, сколько их будет — с клавишами получалось естественней, но на экране айфона места не так много, как на midi-клавиатуре. После долгих экспериментов их осталось 5. Весь список еле уместился на фотографию:



    После сведения всего скриншот с победителями выглядит так:



    Всем персонажам дали клички, к примеру самый тощий — Освенцим. Кое-кого назвали в честь внешнего сходства с коллегами. С анимацией было сложно, освенцима пришлось даже переделать (в текущей версии он дергается, как паралитик, в версии 1.1 вылью обновленного). Сводил все по слоям в фотошопе, проверял анимированным гифом. На сведение и вырезку одного персонажа уходило примерно 3 часа:



    Зато результатом я весьма доволен. Конечно, современные дизайнеры и аниматоры ставили в упрек маленький FPS анимации — она состоит из восьми кадров для каждого игрока — зато картинки получились уж очень похожими на мультфильмы 20-30х годов прошлого века:



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

    Программинг


    Изначально я разработал полностью работающий прототип на Cocos2D+Box2D, но мне не понравились несколько нюансов:
    • С точки зрения Box2D, каждый игрок представляет собой параллелепипед. Если бы бежал один игрок, некоторые огрехи и погрешности просчета физики были бы просто незаметны, а при синхронном беге пяти игроков в произвольные участки времени дистанция между ними то сокращалась на пару пикселей, то наоборот увеличивалась. С чем это было связано, я так и не разобрался, но нашел в интернете информацию, что такие сложные движки не стоит использовать в раннерах хотя бы по этой причине — выходит, не я один наткнулся на эти грабли;
    • Мне не особо понравился Cocos2D ввиду его слабой инкапсуляции — в SpriteKit код получается короче и более понятным, ввиду отсутствия ОГРОМНОГО_ВИДА_OPENGLES3_КОНСТАНТ и иных прямых вызовов OpenGL, которые мне порой напоминали кошмар WinAPI — нужно либо знать его досконально, либо курить кучу документации и форумов, что в конечном итоге приведет к доскональному знанию огромного количества констант, без которого мне неплохо живется.


    В итоге я переписал все на SpriteKit (а что, имею право, проект-то мой), а в качестве физики написал примитивный движок — не более, чем требуется для 2D-раннера, строк на 100. Ничего интересного или нового в нем нет, любой программист напишет такой же за день. Зато единицы измерения из сферических в вакууме превратились в пиксели на секунду и на секунду в квадрате — с такими вполне приятно работать, в отличие от абстрактных для девайса метрах :)

    А вот с миром пришлось знатно повозиться — изначально я хотел написать бесконечный скроллер с автогенерируемым миром, что и доставило мне массу приятных и не очень впечатлений. Все слои видимого мира генерируются случайно, по определенным законам, в некоторых из которых (например, алгоритме генерации деревьев на фоне) я не могу разобраться до сих пор. Код пестрит магическими константами вида «три корня из двух на два», которые с течением времени утеряли для меня смысл — зато смотрится прикольно! Наверное, про это стоило бы написать отдельную статью.

    Также я довольно хитро сделал параллакс деревьев — когда крутишь телефон в руках, они изображают 3D-эффект. Добавил невидимую вьюшку, параллакс которой обсчитывает сама iOS, и на каждый тик игры считываю дельту ее координаты, которую умножаю на удаленность дерева от пользователя (1 — самое дальнее, 0 — самое ближнее) и складываю с (X; Y) самого дерева. Получается довольно симпатично и производительно.

    Кстати, с производительностью тоже пришлось изрядно повозиться, но тут больше по неопытности — к примеру, самым большим тормозом оказалось то, что я обращался к UIKit-элементу на каждом цикле перерисовки. Наконец-то я понял, для чего в игровых движках есть свои кнопки и лэйблочки! А я-то, неуч, сделал HUD на обычных iOS-овых контролах.

    Заключение


    Музыку мне по знакомству написал лидер одного белорусского рэп-коллектива за символическую плату в 1 банку бабушкиной аджики, которую он любит со времен обучения в институте. По-моему, она прекрасна сама по себе (и музыка, и аджика). Остальные звуки нашел наш тестировщик Игорь на стоках, за что ему огромное спасибо как и всем, кто помогал мне в создании игрушки. Чуть не забыл, ссылка на апстор, приятной игры! Буду рад каждому комментарию!

    UPD: по ссылке видео геймплея.
    Share post

    Similar posts

    Comments 22

      +1
      Слышал, выпустили Apple Metal API, как альтернативу Open GL, не присматривались к нему?
        +1
        Читал немного. Думаю, SpriteKit в iOS8 работает поверх него. А вообще, в моем случае игра слишком простая для таких микроскопов как Metal, вот в танках для iOS было бы где развернуться!
        +7
        Иллюстрации получились довольно годными. С точки зрения рисования даже лучшие программы и планшеты для него жизнь никак не облегчают, со всеми векомами и критами карандаш&бумага остаются самыми удобными средствами.
          +4
          Спасибо! Рисовала от души, а с пакетами работать, уверен, научится — тут дело техники.
            0
            Не обязательно себя корежить, пусть купит планшет с сенсорным пером
            p.s. очень приятная графика
          +5
          Оу. Очень классные иллюстрации вышли. Настоящий олдскульный ужастик. Вы молодец!
            +2
            Иллюстрации шикарные. Только вот имя Освенцим это как-то перебор.
              –2
              Offtop
              Это лишь место. Или вы и за запрет древнего символа солнца, потому что он фашистам по нраву пришелся? А если бы они пропогандировали традиционную сексуальную ориентацию? :)
                –2
                Ну если для вас всё так просто, я за вас рад, но я бы не купил игру с персонажем Освенцимом какой бы хорошей она не была. Впрочем и когда самому тощему персонажу дают такое имя, это не потому что ему в биографию закладывают место его рождения )
                Re:Offtop
                ps: и да, для меня свастика, и Освенцим это не знак солнца и место на карте, это часть не столь давней истории и символы идей (которым в последнее время пытаются дать очень нейтральный оттенок) которые мне чужды.
                  0
                  я ни в коей мере не хотел оскорбить память жертв освенцима, в игре, да и даже в исходниках упоминания о нем нет. К тому же, игра полностью бесплатная, даже не фримиум, ее не надо покупать :)
                  +2
                  Ну вы же сами сказали, что он самый тощий, потому и Освенцим, а не по тому, что он просто поляк и родился в городе Освенцим.
                +2
                В следующий раз возьмите Unity и не мучайтесь с нативом. Плюс, получите кросс-платформенность из коробки
                  +1
                  С удовольствием, мне вообще нравится на чем-то новом писать, чтобы было с чем сравнивать!
                  +1
                  Пытался установить, не вышло, требует ios8. Вы уверены, что оно там реально нужно или просто забыли где-то снять галочку «требовать самую новую ios»?
                    +2
                    Что-то там использовал, но не критичное… а вы из принципа не хотите на iOS 8 обновляться? Все равно ж придется рано или поздно :)
                      0
                      Кто бы мне подсказал, как, не залезая в подштанники ipad2, вернуть ему ios7…
                        0
                        задайте вопрос на тостере :)
                        +1
                        Знающие люди говорят, что восьмерка тормозит даже на девайсах последнего поколения. А у меня ipad2 и я его обновлять не буду ни рано ни поздно:)

                        Кстати, по моим данным (игра, около 6млн юзеров) — примерно 40% пользователей продолжает сидеть на семерке. Так что вы существенно уменьшаете возможную аудиторию.
                          0
                          Надо будет попробовать в следующем билде собрать под Base SDK 7. Если нормально соберется, почему бы не выпустить?
                          0
                          Теряете пользователей, я вот тоже хотел глянуть, но iOS8 ставить желания нет
                        –1
                        Проект выглядит необычно, мне нравятся игры, где реальные рисунки оцифровываются, вместо перевода в вектор, душевно получается.
                        Пожалуйста, если проект у вас некоммерческий, не могли бы выложить исходники на github? Думаю, многим будет интересно. Заранее спасибо.
                          +3
                          Мне-то не жалко, но есть 2 фактора, которые мне мешают это сделать:
                          • Как-то директор нашей компании делал свою игру, так же по фану как и я. И забыл закрыть репозиторий на гитхабе, в итоге китайцы выложили его игру на апстор как свою, со своими пурчейзами и рекламой. Я думаю, они мониторят все открытые git-репозитории и тырят все, что можно выложить как бы от своего имени.
                          • Ну и банально стыдно за код :) Если б это было обычное приложение, я б не стыдился своих исходников — все-таки 5 лет в iOS-разработке, а игровой код, я сам это понимаю, ужасный.

                          Впрочем, если вам лично интересен какой-нибудь момент, я с удовольствием про него расскажу!

                        Only users with full accounts can post comments. Log in, please.