Как я разрабатываю словесные игры для iOS
Вступление
Разработка мобильных игр — это моё хобби. Я не генерирую идеи для игр каждый день, но когда идея приходит ко мне, я стараюсь её реализовать. Почти все игры, которые я опубликовал — игры в жанре «Словесные». Да, те самые, в которые играет твоя мама.
Почему именно так? Моя выпускная работа в университете была на эту тему (почему именно такая — это отдельная история) и с тех пор я разрабатываю игры в этом жанре. Только изредка отклоняюсь и делаю что-то другое.
В данной статье, я опишу весь процесс разработки игры на конкретном примере.
Концепция
Идея, которая пришла мне в голову — совместить физическую составляющую action-игр и словесную составляющую словесных.
Концепция простая — поток блоков с буквами летит из левого края экрана в правый в зоне по центру экрана. От границы зоны блоки отсакивают. После вылета за правую часть экрана, блок исчезает, на его место респавнится новый блок и появлятся из левой части экрана.
Из этого потока игроку необходимо выцепить нужные буквы, которые составляют слово снизу экрана. Время ограничено — в начале сессии дается 30 секунд. После клика на нужную букву, она появляется в нужной ячейке сверху экрана. После того, как игрок собрал слово, ему добавляется время и появляется новое слово для сбора.
1 день. Разработка основных механик
Игры я разрабатываю с помощью фреймворка SpriteKit на языке Swift. Иными словами, нативные игры для iOS. Не самое лучшее решение, но у меня есть на это свои причины.
Для начала сделал отрисовку границы зоны пролета блоков. Добавил спавн блоков с буквами. Передвижение блоков решил сделать с помощью физики — гравитация мира тянет блоки в правую часть экрана.
Это был самый трудный момент, ибо с физикой в SpriteKit я практически не работал. И гайдов в интернете не так много, из-за этого, многое делается наугад. Особенно коллизии объектов.
После нескольких часов появился рабочий прототип — поток букв, выбор нужных блоков и спавн слова для сбора работали. Слово, которое необходимо собрать, появляется снизу. Правильные буквы, на которые кликнул игрок, появляются в блоках сверху.
Добавил красоты в виде партиклов. Партиклы появлятся после нажатия на блок с буквой.
Самый бесячий момент дня — потратил около часа на проблему, которая появляется только если тестировать игру на физическом устройстве. Проблема в том, что зона safeArea не закрашивается цветом той UIView, что находится под ней. И не закрашивается только, если UIView под ней черного цвета. С белым и остальными цветами все отлично.
Если делать скриншот или записывать видео с физического устройства, то этого не видно. Единственное, как можно задокументировать — сфотографировать телефон на другой телефон.
Проблему так и не решил. На симуляторах ее нет, возможно, после залива в TestFlight проблема пропадет. Ну или я просто поменяю цвет фона.
2 день. Доводим игру до конца
Для начала решил изменить то, как показывать игроку те буквы, которые он уже собрал. Блоки сверху решил убрать и вместо этого вывести туда таймер. А в слове снизу [то слово, что необходимо собрать], подсвечивать зеленым цветом собранные буквы.
Добавил лейбл с очками — в центр за пролетающими блоками. При увеличении кол-ва очков, лейбл окрашивается в зеленый цвет на секунду.
Покрасил приложение в адекватные цвета. Обычно я пытаюсь найти нужное сочетание самостоятельно, на что уходит много времени, но в этот раз нашел нужное мне сочетание сразу в интернете. Тем самым, значительно сократив себе время.
И раз уже подбирал цвета, решил сразу нарисовать иконку. Тем более, она мне понадобится в главном меню. Иконку в этот раз сделал очень быстро и легко. Отрисовал типичный блок с буквой [Е есть и в английском и русском языках], стащил с интернета две картинки, объединил и перерисовал, добавил к блоку. Получилось очень круто, на мой взгляд.
Сделал главное меню, подсказку, экран окончания уровня и лидерборд.
Главное меню типовое, я его использую в последних проектах — иконка игры и три кнопки — начать игру, таблица лидеров, оценить игру. Подсказка и окончание уровня также типовые.
С таблицей лидеров проблем не возникло — воспользовался реализованным решением из другого проекта. Таблица лидеров у меня хранится в Firebase. При первом посещение таблицы лидеров пользователь вводит свой никнейм для таблицы.
Добавил финальные штрихи к игровой сцене — функциональные кнопки в верхней части экрана и новую игровую механику — бомбы и дополнительное время.
Чтобы игрок не тыкал бездумно на все блоки подряд, добавил бомбу. При нажатии на бомбу, уровень завершается. С другой стороны добавил положительный, для игрока, предмет — блок с с временем. Если нажать на него, то игроку дается дополнительные 10 секунд.
После этого добавил словарь английский слов в игру и локализовал интерфейс на аглийский [первоначально все делал на русском]. Добавил Flurry для отслеживания действий пользователя. И AdMob, для размещения рекламы.
Вчерашняя проблема с окрашиванием safeArea ушла сама собой, типичный Xcode.
Ну и в самом конце моя самая нелюбимая часть — производство скриншотов для AppStore. 3 основных устройства по 4 скриншота на двух языка.
Вечером второго дня отправляю игру на ревью в AppStore — неплохо!
3 день. Отказ в публикации
Сомнения в том, что будут проблемы у меня возникли еще тогда, когда игра не прошла ревью за ночь — обычно именно столько времени это занимает. И правда, через 24 часа после отправки Apple отклонили игру.
Apple не понравилась ссылка на группу в ВК, которую я указал как адрес поддержки. И у них не сработала кнопка «Оценить приложение».
Странные причины для отказа. Во второй раз у меня отклоняют приложение. Но в прошлый раз, причина была более понятной.
Проверил кнопку — она работает, что на симуляторе, что на двух разных физических устройствах. Возможно, после перезаливки билда, проблема, если она и правда случилась у ревьюера, уйдет сама. А возможно, на повторном ревью, будет другой человек, у которого не будет таких проблем.
Cсылку на вк, в качестве поддержки, я оставлял к остальным моим приложениям — никогда не возникало вопросов.
После поиска в интернете и вопросов в iOS-комьюнити, обнаружил, что чаще всего создают отдельную группу для приложения на фейсбуке и указывают ее. Так и сделал, после чего отправил на повторную проверку.
4 день. Публикация игры
Повторное ревью, обычно, занимает гораздо больше времени, но на этот раз мне повезло — через 20 часов после отправил на проверку, приложение опубликовали.
Итого
За два дня разработки и два дня ревью я опубликовал игру в AppStore. После тестирования на друзьях, выявил проблемы и недостатки. В ближайшее время буду делать обновление, которое это исправит.
P.S. Приветствую любые вопросы, предложения и пожелания к игре!
Иконка шикарная!
Спасибо за статью, успехов в дальнейшей разработке.
Какие метрики успели собрать после релиза, можете поделиться аналитикой, спасибо)
В Flurry собираю, конкретно для этой игры, только скор игрока по окончанию уровня. Остальные стандартные показатели [прим. время сессии] Flurry собирает сама.
Комментарий недоступен
Игроки все так же бездумно тыкают на блоки. Необходимо отнимать очки за клик на неправильный блок
И необходимо переписать таблицу лидеров, есть ошибки в коде
Можно подробнее про таблицу лидеров? Нужно платить за пользование сервером где этот список хранится?
Вот ссылка на прайс Firebase: https://firebase.google.com/pricing
В данном случае автор, вероятно, использовал функционал Cloud Firestore. Там к тому же довольно подробная и понятная документация.