Pull to refresh

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

Reading time 7 min
Views 35K
В начале апреля я уволился с работы. От переизбытка свободного времени я решил написать игру для 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

Tags:
Hubs:
+48
Comments 50
Comments Comments 50

Articles