Пользователь
0,0
рейтинг
26 августа 2014 в 13:44

Разработка → История создания iOS игры о быстрой реакции и стальных нервах из песочницы

В начале апреля я уволился с работы. От переизбытка свободного времени я решил написать игру для iOS. Игра про бедного кубика, которого постоянно преследуют другие геометрические фигуры. Настоящая драма. Кубику нужно продержаться как можно дольше без столкновений. Прототип игры был написан примерно за 8 часов. Всего разработка игры заняла 3,5 месяца. Чем я занимался все это время можно узнать ниже.



Разработка


Я использовал фреймворк cocos2d-swift. Он очень популярен и удобен. Его плюсом по сравнению со SpriteKit является поддержка версий iOS ниже семерки. Игра писалась одновременно под iPhone и iPad. Для iOS 6+.



Для того чтобы рекордом можно было поделиться используется UIActivity. Как добавить шаринг ВКонтакте к доступным по умолчанию хорошо написано в этой статье: habrahabr.ru/post/214637.

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

На табло под игровым полем всегда показывается мировой ранг игрока. Показывается он только для игроков, которые зарегистрированы в Game Center. В Game Center, помимо самого результата, отправляются контрольные данные с использованием хеша от результата, даты и некой вшитой в код строки. Отправляется хеш в переменной context. Да, я понимаю, что это не панацея, но по-моему мнению это поможет выявить подавляющее большинство поддельных результатов и удалить их. 100% защиты от поддельного результата в Game Center сделать невозможно. Это не онлайн-игра и мы доверяем данным пришедшим от стороннего устройства.

Код для перемещения бедного куба:
- (void)touchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
    if (_gameStatus == kGameStatusStarted) {
          CGPoint currTouchLocation = [touch locationInNode:self];
          _hero.position = ccp(_hero.position.x + currTouchLocation.x - _lastTouchLocation.x,
                                                _hero.position.y  + currTouchLocation.y - _lastTouchLocation.y);
          _lastTouchLocation = currTouchLocation;
    }
}

Главный герой перемещается по игровому полю, когда игрок водит пальцем по экрану. Если игрок подвинул палец на сантиметр вверх в любой части экрана, то куб тоже поднимется на сантиметр. Для максимально быстрого отклика на движения игрока фактически куб мгновенно телепортируется, а не перемещается. Пальцем можно двигать очень быстро, можно пролететь все игровое поле за 1-2 кадра при 60 кадрах в секунду. Тут проявляет себя туннельный эффект. Из-за того, что столкновения проверяются только 60 раз в секунду, можно проскочить сквозь врага и коллизии не произойдет. Я пошел по самому простому пути. Увеличил частоту симуляции всех передвижений и проверку коллизий в 6 раз. Почему в 6? Просто экспериментировал с этим коэффициентом и обнаружил, что если обновлять все позиции 360 раз в секунду, то уже все отлично. Делать еще чаще, только зря расходовать ресурсы ЦПУ. При коэффициенте 6 нагрузка на ЦПУ увеличивается всего на 10%. В iOS текущее положение пальца на экране также выдается 60 раз в секунду, повлиять на частоту опроса сенсорного экрана никак нельзя. Тоже не мудрим, просто находим 5 промежуточных точек между текущей и предыдущей:

for (i = 1; i <= kPositionsUpdatesPerFrame; i++) {
  currNewHeroPosition = ccpAdd(_lastFrameHeroPosition, ccpMult(heroStartAndNewPositionsDifference, i / kPositionsUpdatesPerFrame));
  …
}

Туннельный эффект:

somealt

Графика


Предыдущая иллюстрация это предел моих художественных возможностей. Дизайнера я нашел на Фрилансе. Девушка с добрыми и солнечными рисунками, которую я попросил изувечить кубика. Большим плюсом было то, что рисует она в векторе, так что у меня не было никаких проблем с разными разрешениями айпадов и айфонов и мелкими правками. Обошлось в 21500 рублей. Плюс 900 рублей за Adobe Illustrator CC на месяц (пробные 30 дней закончилась и я случайно закрыл программу).



Вариации следов побоев:



Вариант иконки в кипе:



Геометрические фигуры:



Музыка и звуки


Обязательна ли музыка в такой простой игре? Думаю нет. Но я все-таки решил, что хочу добавить музыкальное сопровождение. Я слушал музыку в крутых проектах с миллионными бюджетами и если музыка мне нравилась, то я искал композитора игры. Я выбрал двух композиторов. Один отказался из-за контракта с компанией на которую он работает, по которому он не может писать музыку для других мобильных игр, а второй (не по профессионализму) согласился. Музыка обошлась примерно в 14500 рублей.

Звуки я подбирал в бесплатных и платных звуковых стоках. Советую эти: freesound.org и pond5.com. На freesound.org можно случайно набрести на звуки, которые использовались в Minecraft или Flappy Bird. А на pond5.com огромное количество хорошей музыки и звуков за небольшие деньги.

В настройках 2 выключателя: для музыки и для звуков. Я часто видел, что люди просят такую опцию в других играх.



Монетизация


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

В игре используется полноэкранная реклама от iAd, AdMob и Chartboost. На мой взгляд это самые выгодные сети на данный момент. AdMob, купленная Google, поддерживает не только свою рекламную сеть, но и больше десятка сторонних, включая iAd от Apple. То есть достаточно внедрить AdMob, а через него уже подключить другие сети, не разбираясь в их документации часы напролет. Chartboost, к сожалению, не поддерживается. Для каждой подключаемой сети нужно скачивать у Google адаптер и добавлять его в Build Phases -> Link Binary With Libraries.



Локализация


Игра переведена на 14 языков. Список языков я взял в Real Racing 3 и добавил к нему турецкий язык. Естественно это должен быть самый последний шаг, иначе вы замучаетесь исправлять все переводы если что-то изменится в игре. Вообще лучше стараться чтобы все было понятно без перевода, если это возможно. Иконки наше все.

Переводил на сайте onehourtranslation.com. Желательно предоставлять переводчикам исчерпывающие комментарии к каждой строчке, плюс скриншоты и видео, тогда все пройдет гладко и вам не придется долго и мучительно объяснять китайцу, что тут имеется ввиду. Перевод обошелся в 4000 рублей.

После локализации появляется небольшая проблема. Вам нужно будет сделать гору скриншотов (в моем случае 210), да еще и залить их все в Itunes Connect. (2 разрешения айфона + 1 разрешение айпада) * 5 скриншотов * 14 языков = 210 скриншотов. Думаю на тридцатом скриншоте захочется убивать. На помощь приходят UI Screen Shooter для автоматического щелканья скриншотов на всех языках и iTC Localized Screenshot Uploader для автоматической заливки скриншотов в Itunes Connect. Оба проекта доступны на github. Я сделал специальный режим игры для щелканья скриншотов, в котором все идет «по рельсам» и написал простейший скрипт для UI Screen Shooter, который жмет по экрану, делает скриншот, ждет, потом опять жмет и так далее. На 210 скриншотов уходит пол часа. Но главное, что все делается полностью в автоматическом режиме. Скрипт для UI Screen Shooter:

#import "capture.js"
var target = UIATarget.localTarget();
var window = target.frontMostApp().mainWindow();
var model = target.model();
var delayFactor = 1.0;
if (model.match(/iPad/)) {
  delayFactor = 3.2;	
}
target.delay(2.5 * delayFactor);
target.tap({x:100, y:200});
target.delay(2.0 * delayFactor);
captureLocalizedScreenshot("screen1");
target.tap({x:100, y:200});
target.delay(2.0 * delayFactor);
captureLocalizedScreenshot("screen2");
…

Коэффициент delayFactor для айпада получен экспериментально. Я его ввел, так как симулятор Retina iPad страшно тормозит на моем Макбуке и все задержки приходится увеличивать.



Поиск издателя


Информацию об игре я разослал следующим издателям: Chillingo, FDG Entertainment, Fingersoft, Wooga, KamaGames, G5 Games, Apps Ministry, Pocket Gems, Renatus, Big Fish Games, Game Insight. Некоторые даже ничего не ответили. Пара издателей попросили отправить им тестовую версию.

Один издатель заинтересовался и сказал, что игру можно продвинуть в топ-10 бесплатных приложений в нескольких странах. Все доходы пополам.

Заработок в игре зависит от количества игроков заходящих в игру в течение дня (DAU — Daily Active Users). Все знают, что Flappy Bird зарабатывал $50000 в день. Дневная аудитория игры составляла 2 миллиона игроков. После попадания в российский топ аудитория игры составит 20 тысяч человек в сутки, что принесет $300-400 в день с рекламы. При этом если у приложения плохие отзывы, непривлекательная иконка или скриншоты, да и само приложение ни о чем, то после окончания потока платных установок приложение полетит камнем вниз из топа, и вложения издателя никогда не окупятся.

Будьте готовы отдать 13-20 тысяч долларов чтобы гарантированно оказаться в бесплатном топ-10 в российском App Store на один день. Цифры могут отличаться, все зависит от виральности игры, то есть от того как люди будут советовать игру. Люди пришедшие по совету друзей бесплатны для вас. Если каждый пользователь будет приводить одного нового пользователя, то приложение ждет взрывной рост. На деле этот показатель почти всегда меньше единицы. Покупка установок для выхода в топ недешевое занятие. Одна установка обойдется в $1.5-3. Тут виральность не учитывается, с ней дешевле. Почему цель попасть в топ? Думаю очевидно, что когда приложение попадает в топ, это дает огромное количество бесплатных установок, так как люди эти топы просматривают.

Один игрок в крупной и качественной условно бесплатной игре типа 3 в ряд приносит более $3-4 за все время своей «жизни» в игре. Такой высокий средний заработок с одного человека в бесплатной игре достигается не без участия так называемых «китов», которые могут спокойно потратить пару сотен долларов на внутриигровые покупки в одной игре. С рекламной моделью такого добиться нереально. В конце концов представитель издателя расписал все расклады и сообщил, что они решили не брать на себя такой риск.

Интересный факт


С вечера 18 августа по вечер 23 августа все отправленные в Game Center результаты исчезали примерно через 30 минут после отправки. Во всех играх. Apple признала сей факт только 22 августа на форуме разработчиков. Я получил несколько отзывов от игроков о том, что их рекорды пропали. С моей стороны было ошибкой доверять информации, которая приходит из Game Center. Результаты некоторых игроков обнулились локально из-за этой неполадки. Основное количество рекордов полученных с 18 по 23 августа вернулись в таблицы результатов. Но не все.
Темы на форуме Apple для разработчиков:
devforums.apple.com/thread/241761?tstart=0
devforums.apple.com/thread/241366?tstart=0

@txtx
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (50)

  • НЛО прилетело и опубликовало эту надпись здесь
  • +4
    Кто-нибудь знает почему картинки вырезаются после публикации?
    • 0
      Хабр перезаливает их на habrastorage.org/ — рекомендую их вручную туда залить. Это ускорит процесс.
      • +2
        Я их туда и залил вручную. Первые две видны у остальных ставится src="".
        • 0
          Круто, таких багов ещё не встречал на хабре =)
          • +1
            Да уж. В предварительном просмотре все ок.
        • 0
          Столкнулся с той же проблемой в субботу. Как решать — не знаю, в итоге с другого ресурса картинки подгрузил, но это конечно не выход. Более того, если в предварительном просмотре 2 раза обновить страничку они тоже пропадали.
          • 0
            Указали бы на какой ресурс. :)
            Сейчас попробую перезалить на какой-нибудь фотохостинг.
            • 0
              Моя статья была переводом — я на картинки из оригинальной статьи ссылки поставил. У вас так нельзя выкрутиться :)
              • 0
                Большое вам спасибо! Залил все кроме первых двух на фотохостинг. Теперь не вырезаются. Надеюсь фотохостинг не будет чудить.
  • +4
    Так что в итоге издателем и релизом игры? Решили своими силами выпускать? Забили и просто выпустили игру? Или решили вообще не выпускать? )
    • 0
      Выпустил сам. Решил продвигать своими силами. А так конкуренция в App Store страшнейшая. Даже одновременные обзоры на нескольких популярных ресурсах не гарантируют топ.
      • +6
        Расскажите, плз, что делаете для продвижения. Каких результатов добились? Кол-во игроков, доход? Общее кол-во загрузок?
        • 0
          Из позитивного: дневная аудитория игры увеличивается с каждым днем, рейтинг игры в российском сторе 5 звездочек и более 50 оценок в целом. Это приятно. Без попадания в топ ждать какой-то окупаемости бесплатного приложения с рекламой не приходится, к сожалению. Попасть туда по-моему мнению можно имея известный бренд, получив фичеринг Apple или покупая трафик. Ну конечно бывают исключения. В целом старт у меня не очень радужный: по Чартбусту сейчас чуть за 2.6к инсталлов. Средний eCPM $6.5 по тому же Чартбусту, что очень неплохо.

          По раскрутке. Раскрутка началась где-то через 4 дня после релиза, т. к. один популярный ресурс отказал в публикации по техническим причинам, хотя потом он передумал. :) Также не продвигал приложение в период, когда штормило Game Center, т. к. игра берет оттуда данные и мне не хотелось словить единиц в рейтинг (все-таки словил). В основном пишу на тематические сайты и форумы. За пределами России раскруткой практически не занимался. За рубежом неплохой бесплатный трафик дает reddit, например.
  • +1
    Вы молодец. Но мне всегда было интересно, почему люди создают клоны успешных и не очень игр, а не делают свои, хотя бы на основе существующих идей. Расскажете?
    • +2
      а не делают свои, хотя бы на основе существующих идей.

      Потому что это безумно сложнее, скажу вам как делавший и то и другое.
    • +1
      Спасибо. Мне просто понравилась идея, как еще это объяснить я не знаю. Я долго рылся в App Store и пытался найти хоть один вариант в который можно играть. Во все варианты, что я нашел в App Store можно играть только имея стеклянные пальцы. :) Как вы относитесь к количеству клонов игры 3 в ряд? Или King.com, которая клонирует собственны игры? :) Самое удивительное, что они все жутко популярны.
      • 0
        Ну, плохие клоны — это плохо, хорошие клоны — это, пожалуй, хорошо. Да?
        • +1
          Я думаю нет смысла делать аналог, если у него нет никаких преимуществ. Это пустая трата времени.
  • +9
    Персонаж до неприличия похож на героя игры Super Meat Boy.
    • +1
      Согласен. :)
  • 0
    Так что за игра-то?
  • 0
    Очень круто, видны профессиональный подход и опыт.
    Не отвеченным остался главный вопрос: автор, какой у тебя рекорд в своей игре?
    • 0
      Спасибо.
      Если честно, меня немного удивляют довольно низкие результаты игроков. Когда тестировал набирал 62 секунды максимум.
      • +2
        Нужны бонусы и очки (время это не то же самое).
        Бонусы могут быть на неуязвимость, на убийство «противников» на увеличение очков и т.д. Их же можно и продавать.
  • 0
    У вас там в видео в конце поста есть мелкий UI баг.
    на 0:40 и чуть дальше позиция в рейтинге обновляется уже после того как человек начинает играть. Выглядит так будто бы я закончил раунд, полуил время и звезду, начал играть и, о чудо, из-за начала игры я переместился на 25 место!

    Ну я понимаю почему оно да.
    • 0
      Если сразу запрашивать рейтинг после того как становится известно, что новый рекорд отправлен без ошибок, то велика вероятность получить старый ранг. Такой вот Game Center. Экспериментально определил, что если запрашивать через 4 секунды, то все будет ок.
      • 0
        ну понятно что всё не просто так, но я бы отложил обновление рейтинга до окончания следущего раунда. нелогично что он меняется в процессе прямо на виду, проявляет активность и заставлять отвлекаться на посмотреть что там происходит.
        • +1
          Это даже реализованно. Я думал абсолютно так же. Но тогда будет выглядеть странно, что ранг будет всегда улучшаться после игры, которая следует за рекордной игрой, даже если результат последней игры был плохим. Подумал пусть уж лучше обновляется так скоро, насколько это возможно.
          • +2
            Ну можно тогда перед отправкой запроса прятать рейтинг или делать его серым. Или ничего не делать. Мне вообще всё равно, я мимо проходил. Извините.
  • +2
    В конце таких постов всегда хочется увидеть какие получились результаты все таки) имею ввиду загрузки и заработок. Хотя бы порядок цифр))
    • +1
      Думаю автору пока рано говорить о цифрах, игра в аппсторе висит 2 недели. Хотя признаюсь, всегда в таких статьях жду цифр.
    • 0
  • 0
    Я вот на днях выпустил простенькую игру, раньше — более серьезную, без вложения огромных денег в продвижение пробиться в топы нереально.
  • +1
    Статья показалась незаконченной. Как то не была подведена черта, не сделан вывод. Особенно заинтриговало наличие цен за труд по созданию игры, но не озвучено окупилось ли все это.
  • 0
    210 скриншотов… Не было мысли схитрить и сделать один набор скринов нейтральных по отношению к языку? Добавить какие-нибудь вставки поверх текста внизу, «замылить» или что-то подобное. Некоторые разработчики так и поступают, в качестве скриншотов используется какой-нибудь арт или компонуют сразу 4 экрана в одном скрине, при этом избегая текста.

    Спасибо за наводку на uploader, по сути это продвинутый генератор XML метаданных для iTMSTransporter. Мне кажется образовалась ниша для OSX приложения, которое будет удобной оберкой для iTMSTransporter. Там большое количество задач, которые требуют автоматизации и удобного интерфейса.

    А как так получилось использовать cocos2d-swift и зарелизить приложение? Ведь Swift доступен только в Xcode 6 Beta, а насколько я помню, приложения собранные в beta версиях Xcode Apple никогда не принимала…

    И последний вопрос :) В плане локализации использовали старые добрые .strings или XLIFF добавленный в Xcode 6? Не посоветуете простой софт для работы с XLIFF? Я перепробовал все опенсорсные программы, которые смог найти, все со старта отпугнули сложностью и избыточностью интерфейса, а я искал что-то «для чайников», типа слева оригинал — справа пиши перевод.
    • 0
      Чуть промахнулся с ответом. :)
  • 0
    Мысль схитрить со скриншотами была. Если бы не было инструментов для автоматизации, то я бы схитрил. Даже если нет локализации автоматизация очень удобна, если что-то меняется в графике, например. Попил чаю, а новые скриншоты уже готовы.

    Да, судя по тому, что указано на странице про Swift, релизить можно только после официального выхода iOS 8. Cocos2d-swift это просто новое название cocos2d-iphone. Мной Swift не использовался.

    Использовал старые добрые .strings :)
  • 0
    Вы так много написали про локализацию и при этом нет кнопки переключения языка в настройках… ((
    По теме: Игра показалась немного фрустрирующей. Флэшовый аналог игрался лучше. Много фэйлов в самом начале, думаю Вам стоит первый импульс всегда давать от игрока, тогда эта проблема может быть решена.
    За смелость и доведение дела до конца Вам огромный респект и уважуха. Надеюсь Вы заработали себе на печеньки ;)
    • 0
      Вы так много написали про локализацию и при этом нет кнопки переключения языка в настройках… ((

      А насколько большой спрос на подобную фичу? Если судить по себе, то в 99.9% случаев меня устраивает дефолтный язык операционки и нет необходимости его менять отдельно в играх. Возможно в детских приложениях может быть спрос на такую опцию.
      • 0
        Если судить по себе, то можно делать игры исключительно для себя. Есть случаи, когда переключить язык необходимо или желательно. Опять же по себе — я меняю всегда на Английский.
  • 0
    Идею где брали? Просто похоже на игру называется Крассный квадрат по английски в аппсторе
    • 0
      Тест реакции американских летчиков, якобы. :) Мне кажется он лет 10 назад появился, точно не знаю.
      • 0
        Не знаю на счёт 10 лет, но лет 8 назад игрался в такое, только это на флэше было. До сих пор где-то в недрах жёсткого этот самый флэш валяется.
  • 0
    Есть ли возможность сделать крестик закрытия всплывающего окна рекламы побольше?
    Поиграл 20 минут в вашу игру, реально бесит, что не с первого и даже не с третьего раза попадаешь по крестику.
    • 0
      Я не могу изменить размер крестика, т. к. это стандартный вид рекламы от Chartboost. Думаю надо сделать показы рекламы пореже.
      • 0
        Я не могу изменить размер крестика...

        Это запрещено какими-то соглашениями или нет технической возможности?
        • 0
          Технически может и можно что-то придумать, но нет стандартного метода для программного закрытия рекламы.
          И конечно любые изменения в исходном коде или интерфейсе запрещены. Пункт лицензии «Prohibited Actions».
          • 0
            Понятно, спасибо за ответы.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.