Много свободного времени = работа над новым проектом. На данную игру меня вдохновила публикация PapaBubaDiop про изгнание вирусов. В отличие от него, я решил использовать нативный фреймворк UIKit Dynamics. Во-первых — я с ним не работал, но очень хотел попробовать. А во-вторых — он нативный. И, хотя в мануале написано, что он не предназначен для создания игр, я все же решил попробовать.
Мне вообще нравятся игры, когда что-то падает, накапливается и идея, что это все должно куда-то пропадать по принципу воронки, подтолкнула меня приступить к разработке.
Имея идею я решил взяться за поиск бесплатных ассетов для дизайна. И случайно наткнулся на пак нарисованных зверушек. Вот и главные мои герои — именно им предстоит падать и кататься. А раз так — должна быть и цель — побег.
Игрок тапает по экрану и, соответсвенно, на этой же вертикали появляется новая зверушка, начиная падать и преодолевать препятствия. Вроде все просто, но нет. Если запустить сразу много зверят — они начнут застревать, тупить и весь побег накроется.
Начальная версия игры предполагала лимитированное время и подсчет кол-ва спасшихся беглецов, но затем я немного пересмотрел детали подсчета. Ведь нетрудно заметить, что форма ребят немножко отличается. Например, олень, мартышка и панда имеют не круглую форму и, соответственно, гораздо сложнее проходят препятствия. Было решено давать кол-во очков (credits) в зависимости от формы.
Вообще в UIKit Dynamics можно описать форму объекта взаимодействия указав параметр UIDynamicItemCollisionBoundsType. Он может быть прямоугольник, элипс или BezierPath. Мой случай — это элипс, причем форма элипса зависит от пропорций ассета объекта. Соответсвенно олень, мартыша и панда — продолговатый овал, а, например, курица, утка и змея — чистого вида круги. Звучит дивно, но такие ассеты)
Животины - овалы
Животины - круги
Самым муторным было, естественно, создание уровней. В UIKit Dynamics препятствие является невидимым, соответственно видимую часть нужно рисовать отдельно. Пришлось подготовить набор структур, каждая из которых содержит начальную и конечную точку препятствия и проходясь по ним — делать отрисовку и добавлять в виде барьера.
Сделав уровень я садился тестировать его и всплывало много проблем. Например, угол наклона слишком мал и животины начинали скапливаться, делая невозможным прохождение. Или расположение препятствий было так себе. Также тестовым путем находил реальное кол-во очков (кредитов), которые можно набрать на уровне. Теперь могу утверждать, что все уровни проходимы.
Когда уровней накопилось достаточно и игра стала близкой к готовности релиза, я решил добавить последний штришок — сделать некоторых питомцев более живыми. Поскольку ассетов с закрытыми глазами в бесплатном паке не было — было решено посадить за это дело жену. Так у половины зоопарка появилась анимация моргания.
Также под конец разработки было решено показывать следующую выпадающую животину — на некоторых уровнях это реально влияет на выбор места сброса.
В целом UIKit Dynamics и правда не предназначен для разработки игр. Самым большим ограничением стала невозможность анимировать препятствия. Возможно обходные решения есть, но достойных рабочих вариантов я пока не нашел. Поэтому на данный момент все барьеры статичны. При этом фреймворк достаточно прост в понимании, легок в использовании (т.к сразу внедрен) и не требует танцев с бубном.
Парочка советов по прохождению уровней. Не стоит сразу накидывать много живности — они любят кучковаться и застревать. Старайтесь держать дистанцию, но не забывайте про время.
Сама игра доступна здесь и абсолютно бесплатна.
Буду благодарен за отзывы о геймплее и оценки. Реально интересно насколько такой формат геймплея «заходит» обществу.
Будьте здоровы.
candyapple
А почему не SpriteKit? Он же как раз под это все заточен.
Nick_Khod Автор
Хотел разобраться с UIKit Dynamics