Предисловие
В продолжение комментария http://pikabu.ru/story/quotya_sdelal_igruquot_nakipelo_4059294#comment_62458685, в котором я на крик души пользователя @Perja предложил выложить пост о разработке НЕ говно-игры (как мне кажется) собственного производства, если кому-то это будет интересно.
То количество откликов, которое я получил, меня сильно удивило и порадовало, так как я был удивлён, что такое большое количество людей желает понять разработку игр и начать свой игровой проект или же просто желает обучиться чему-то новому и интересному.
Также, спасибо большое всем за комментарии по игре - они, прямо как бальзам на душу для разработчика! Постараюсь всем ответить в кратчайшие сроки.
Те, кто скажут, что этот пост - просто реклама игры, - ради Бога, я не обижусь, и мне это сложно полностью отрицать. Здесь, действительно, присутствует небольшой элемент хвастовства и большое желание поделиться тем, что я сделал пару лет назад, будучи практически полным нулём в реальном программировании, но желающим понять, на что я способен (таблички Excel, взлом шестнадцатиричных кодов, да рисовка в Гимпе - вот весь мой "запас").
Те, кто решат, что это - игра на говнокоде и автор #@$^#, - отличная критика в мой адрес, и нет мне оправдания! У меня действительно на тот момент было больше желания и рвения, чем каких-либо практических знаний по разработке игр.
Внимание, после этой отметки пойдёт много (длиннопост) технического текста, который, возможно, будет сложен к "переварению" с первого раза. Также, предупреждаю, что доскональной пошаговой инструкции в посте нет - это, скорее, запоздалый дневник разработчика вперемешку с небольшими советами. Так, как пост достаточно длинный, все вопросы по какому-то из этапов или элементов разработки можно смело задавать в комментариях. Здесь же будет дана достаточно общая информация.
Прим. Материалы актуальны для 2013-2014 годов, поэтому сразу извиняюсь, если какие либо элементы повествования будут не совпадать с нынешним раскладом в IT мире.
Также, я постараюсь давать материалы без прямых отсылок, чтобы не было никакой рекламы - здесь я не проповедую какой-то оределённый путь разработки - все решения реализуемы большим разнообразием способов, и совершенно необязательно использовать то, что использовал я. Все ресурсы, которые указаны - заменяемы большим количеством альтернатив из смежной категории.
Итак, вводная прошла, давайте попробуем пройти по порядку от и до. Сама игра называется Robot's eye, доступна только в Google Play для мобильных устройств (разработка была кросплатформенной, но выложить по объяснённым далее простым причинам я её мог только для Android платформы), и представляет собой головоломку, основанную на физических законах и цветовом восприятии.
Никакой рекламы в игре нет, только 40 уровней (20 в первом разделе и ещё 20 в обучении).
В игре есть такие элементы, как музыкальное сопровождение, экран настроек, смена языков и, собственно, уровни с отработкой взаимодействий, основанных на физических законах (из основных: сила тяжести, ускорение, столкновения предметов).
Поначалу, когда было только огромное желание удариться в разработчики игр, было очень тяжело понять, что же должно быть тем проектом, который мне нужно выполнить. Тут, за основу попадалось много хороших вариантов, наподобии Angry birds или Doodle Jump, но меня заинтересовала Cut the rope, весьма добротная игровая серия от отечественных разработчиков, которая интересна не только маленьким пользователям телефонов, но также и взрослым, ввиду наличия уникальной и интересной игровой механики. И тут, желание что-то создать, которое было, но на уровне ниже среднего, примерно в течение года до этого, вдруг прорвало порог лени и страха.
Я стал думать о создании собственного продукта для мобильных устройств. Почитал дневники разработчиков Cut the rope на Хабре (кстати, рекомендую) и увидел, что ребята, действительно, творят какую-то магию, которая проходила всегда где-то мимо меня. Но я не мог просто взять, и скопировать их или чью-то ещё идею - это не красит человека, и решил выдумать эдакую головоломку, которая может и похожа, но скорее по жанру, чем по механике геймплея. В итоге, решение пришло само собой - создать геймплей с физическими законами цветовым восприятием. И не использовать верёвки!!!
Однако, милый персонаж, который, на самом деле сущий демон, забирающийся в самую задницу уровня (и с каждым уровнем всё дальше) и заставляющий игрока постоянно что-то выполнять, причём, ещё и дающий игроку оценки за эти выполненный действия, должен был остаться - это прикольно. Ну, а так как тематика роботов была не особо популярна, выбор пал на маленького большеголового робота, который постоянно теряет свой глаз.
Дизайн решено было делать самому - хотелось оценить свои силы на всех стадиях разработки, от дизайнера до тестера, чтобы проверить, что именно подходит мне по ощущениям.
Сказано-сделано. На тот момент, я достаточно неплохо владел бесплатным графическим редактором Gimp, который и использовал для создания статичной картинки робота (да и остальных картинок). К сожалению, два пятиминутных наброска ручкой на бумаге канули в историю, поэтому есть только окончательный вариант рисовки из Gimp. Все кнопки, уровни и задники рисовались по ходу написания уровней, но робот был нарисован ещё до создания игры - это было сделано для того, чтобы, во-первых, всё, по-возможности, плясало от стиля робота, а во-вторых, чтобы я понимал, что уже сделано хоть что-то, и на полпути останавливаться не стоит.
Далее, камнем преткновения стал выбор среды разработки, которую нужно использовать для создания всей архитектуры приложения. Так, как игра должна была использовать физические законы, то выбор сужался до выбора игровых движков, которые предоставляют такие возможности. После ознакомления с основными доступными движками на тот момент, я отфильтровал два основных кандидата - Corona SDK и Stencyl. Оба из них имели достаточно неплохой послужной список, набор возможностей и кроссплатформенность. Сейчас, конечно, есть и другие достаточно неплохие варианты (особенно Unity хорош в последнее время по соотношению качества и доступности), но тогда именно Stencyl и Corona SDK попали в мой личный топ. Я слышал на тот момент про Eclipse+Android SDK, но я был "не бум-бум" в написании кода, а также хотел получить именно кроссплатформенный продукт, поэтому, его рассматривал только в последнюю очередь.
И как я ни старался освоить LUA (язык написания скриптов для Corona SDK), на тот момент я понять его не смог (хотя, оборачиваясь сейчас назад, понимаю, что это был бы немного лучший вариант, в основном, из-за гибкости и доступности разработки в последующем). Что, в итоге, привело меня к Stencyl.
Сразу оговорюсь, что сама разработка на Stencyl абсолютно бесплатна, однако для публикации хоть где-нибудь, кроме Flash или HTML5, нужно в обязательном порядке приобрести лицензию за $200. Забегая вперёд, скажу, что разработка в Stencyl действительно была удобна и проста, и, в знак благодарности, я решил подкинуть ребятам деньжат.
Да, было жалко... Да, я понимал, что это мне нужно только на момент создания этой игры... Но уж очень пригорало в одном месте - очень хотелось потестировать игру на мобильнике и поделиться с друзьями, и, видимо из-за этого, палец случайно соскочил на мышке как раз в тот момент, когда курсор проносился над кнопкой "Купить".
Итак, система выбрана, осталось только её запустить и сделать игру. Просто! Как бы не так!Было крайне тяжело понимать, что необходимо от меня на самом первом этапе. Поэтому, для начала, я просто скачал и разворотил до основания несколько примеров, которые поставлялись с движком.
Далее скриншоты, в основном, пойдут на английском, но русская версия почти у всех ресурсов также присутствует.
После же этого, поняв, как устроен данный движок со всеми своими сценами, поведениями, персонажами, я просто нажал "Add new game" и начал экспериментировать.
В целом, для создания игры Вы, как разработчик, должны понять подробную концепцию своей игры ещё до начала разработки и создать в голове не только крутой конечный продукт, но и этапы достижения этого продукта.
В данном случае, для создания более-менее оконченного продукта, мне пришлось создать много персонажей (как основных, так и второстепенных, типа кнопок, преград или подсказок), сцен, которые этими персонажами надо заполнить, а также много поведенческих последствий на все основные действия. Например, в данной игре, в физическое взаимодействие вступают только элементы с одинаковым цветом, а элементы с разными цветами друг друга совсем не замечают. и таким образом, взаимодействуя с определёнными элементами, игроку необходимо вернуть потерянный глаз обратно роботу. Это, по сути, и является фишкой данного приложения.
В директории с файлами (вне зависимости от выбранного движка), само собой, необходимо было создать систему, по которой можно было хоть как-то ориентироваться и понимать, что где.
Поэтому, лучше сразу (что я сделал, только когда напоролся на это спустя десяток файлов), создать дополнительные папки-категории внутри основной с проектом.
Я распихал элементы вот так для самих сцен:
, где находятся все уровни, экраны выбора уровней, первоначальный экран, экран загрузки, экран настроек и прочее. И вот так это было сделано для основных игровых элементов:
, где находятся игровые кнопки, робот, глаз (который нужно вернуть), болты (которые нужно собирать), подсказки, основные элементы (пропеллеры, пружины, магниты, гусеницы и прочее). Этими элементами потом наполняются сцены, папки с которыми показаны на предыдущем изображении.
Когда элементов немного, называйте их хоть 00, 01, 02, 03... Но, если элементов больше десяти, сразу задумайтесь над именованием, чтобы потом не запутаться. Простые аббривеатуры или сокращения спасут вам много времени и сил.
Само собой, каждый элемент на экране должен иметь свою форму, анимацию и обозначение - этим я и занялся перед основной разработкой. Было создано порядка сотни различных элементов (не пугайтесь, в большинстве своём, это кнопки), для которых были нарисованы с нуля картинки. Каждый созданный элемент в движке имеет свои размеры, вес, упругость, коэффициент трения. Под это все и подгонялись картинки.
Например, гусеница - абсолютно статичный элемент, который всегда закреплён в одном месте (не может перемещаться по экрану), имеет высокий коэффициент трения и практически нулевую упругость. Когда объект попадает на неё, то он не отскакивает, а прочно прицепляется к месту приземления и движется в том же направлении, в котором крутятся шестерни гусеницы. Наоборот, резиновая подушка имеет крайне высокий коэффициент упругости, что позволяет любому объекту, попавшему на неё отскакивать в определённом направении.
После создания основных персонажей, необходимо ими заполнить сцены, которые для начала необходимо создать и связать друг с другом. Для этого, я создал основной экран, который переводит игрока на экран выбора персонажей, а дальше персонаж может кликнуть иконку необходимого уровня для перехода на сам уровень. Все уровни, при победе отправляют игрока к сцене "Победа", а при проигрыше предлагают перезапуститься либо перейти на сцену выбора уровней.
Самое интересное, это как в данном движке подаётся программирование:
Весь процесс производится по визуальным алгоритмам и очень прост в освоении. То есть, по сути, это обычный программный язык, визуализированный для лучшего усвоения. Все блоки имеют свои цвет и форму, что крайне положительно сказалось на моём понимании процесса разработки. В итоге, все действия на каждое событие писались очень быстро и легко.
Были правда и четырёхэтажные формулы
, но тут, видимо, сказывался слабый опыт в таких вещах - вполне возможно, что у всех четырёхэтажных блоков кода были более лёгковесные альтернативы, о которых я на тот момент не знал.
Также, какие-то элементы самостоятельно (как, например, с притягиванием элементов магнитами) я так создать и не смог... Но тут, на помощь приходят разработчики, которые до этого создали огромный список различных стандартных поведений для данного движка. Все эти блоки кода можно свободно скачать и использовать в любом проекте. Во многих движках ситуация сейчас обстоит похожая.
Используйте библиотеки, созданные до этого. Нет смысла изобретать велосипед, тем более когда вокруг столько мотоциклов.
Также, для подогревания интереса, были созданы звёздочки болтики, которые доступны для сбора в количестве трёх штук на каждом уровне. Всем уровням присвоены глобальные переменные, которые и хранят информацию по полученным игроком болтам.
После того, как 20 первых уровней были наполнены и оттестированы (достаточно большой промежуток времени ушёл на многочисленные перезапуски и отладки каждого уровня), я задумался о создании звукового сопровождения, которое тоже добавил в игру к каждому соответствующему персонажу. Почти все звуки я создавал сам, пыхая и угукая в микрофон ноутбука, а после отправляя их в программу Audacity (бесплатная), которая позволяет изменять звуки, обрезая их, регулируя их громкость, тембр, скорость и прочее. И, в итоге, все основные элементы, требующие звукового сопровождения (вентиляторы, звуки отскока, гусеницы и прочее), таки получили его. Но это всё смотрелось скучно без какой-то музыки. Поэтому, было решено вставить какую-нибудь ненавящивую тему. В интернете много различных Musicbox, которые позволяют создать музыкальный бэкграунд из смеси заготовленных звуков. ОСТОРОЖНО, в таких Musicbox часто могут обитать вирусы. Также, Freesound, Royaltymusic и библиотека звуков Youtube Вам в помощь - там можно найти много композиций, доступных для использования в любых целях.
Далее, необходимо было сделать стандартные настройки, типа "Выключить музыку", "Выключить звук" и т.д. Для этого было создано пара глобальных переменных, которые переносились неизменными между сценами и представляли собой всего лишь значения True/False, при которых музыка и звуки, соответственно, работали или не работали. Все звуки происходят в момент какого-либо события, а музыка же идёт на своём канале между сценами и не прерывается до тех пор, пока пользователь не отключит её в настройках либо не выйдет из игры совсем.
Когда с этой проблемой было покончено, настало время показа приложения друзьям. Самым удобным вариантом была демонстрация у каждого на телефоне - тут-то мне и пригодилась лицензия, которую я приобрёл. До этого, у меня уже был настроен аккаунт разработчика Google Play, был приобретён заранее пару месяцев до этого (как я говорил, желание было, но ещё не достаточное, поэтому дело остановилось), и я спокойно смог отправить на публикацию свой первый, скажем так, релиз из 20 уровней.
Сам аккаунт разработчика Google Play создаётся достаточно просто. Единственный неприятный нюанс только в том, что будущему разработчику необходимо уплатить единовременную мзду, которая необходима, чтобы попасть в список тех самых разработчиков. В AppStore, для примера, эта плата выше в несколько раз и взимается ежегодно. А, так, как я приложение планировал для демонстрации, то на AppStore, волевым решением, было принято забить.
Получив ссылку на скачивание, друзья установили, ну и, собственно, игрались, попутно делясь впечатлениями и замечаниями к игре. На основе этих отзывов, я составил ещё 20 уровней, добавил русский язык (до этого, мне удобнее было разрабатывать с использованием аниглийских слов), подправил пару других ошибок, да и выложил очередную версию, которая и доступна сейчас.
Что мы имеем в итоге? Игра из 40 уровней была создана (вместе с рисовкой и изучением движка) за десять дней на коленке. Не спорю, это были десять достаточно упорных дней - я погряз в это с головой и надолго не вылезал. Поэтому этот срок можно спокойно растягивать втрое. Но, так или иначе, могу смело утверждать, что данная вещь вполне посильная человеку, который совсем не знаком с программированием. Тут ведь, самое главное - это начать! Правда, серьёзно я до сих пор не занимаюсь разработкой игр - у меня разработка Web-систем и 3D web-приложений, но порой, опять начинает припекать создать что-нибудь.
Как-то так.
P.S. Если данный пост будет интересен, то, также, я могу рассказать о небольшом и более простом (он занял всего три дня) проекте, который я выполнил пару месяцев назад для понимания принципов разработки игр для Windows 8 и Windows 10.