История одного геймдева

в 19:24, , рубрики: Песочница, метки: ,

Ровно год назад я загорелся желанием написать игру под андроид. Желание было внезапным и обоснованно было только желанием написать игру под андроид. Год назад я начал гордо называть себя Андроид-разработчиком. Год назад я начал усердно скакать на граблях. Возможно, мой опыт окажется кому-то полезным и убережёт от ошибок. Возможно, вызовет лишь улыбку.

Статья состоит из трёх частей:

  1. Введение (скоро закончится);
  2. Краткое описание моего вальсирования по граблям (можно не читать);
  3. Выводы и наивные советы (можно прочитать);

Бубен юного шамана

Java я не знал тогда и не знаю до сих пор. На тот момент смартфоны видел только на витрине и у пассажиров в автобусе, так что с Андроидом тоже был не знаком. От того желание было не только внезапным, но и непреодолимым. Программистское нутро жаждало чего-то нового, захватывающего и интересного. А что может быть интереснее и захватывающе, чем написать игру? Правильно! Написать игру, используя незнакомую технологию!
Я сразу же отмёл любые мысли об использовании готовых движков, фреймворков и конструкторов. Невозможно получить истинное удовольствие, если не писать всё самому с нуля.
Это была моя первая ошибка…

Обладая многолетним опытом коммерческого программирования на C++ и любительским опытом создания игр на DirectX и OpenGL, я не сомневался в том, что разберусь и с геймдевом на Java, ведь синтаксис практически одинаковый, чего там писать-то? За неделю я по диагонали проштудировал книжку по JAVA. ОК, понятно, все знания и опыт С++ не считаются. Не страшно, так даже интереснее! На этом этапе я был несколько огорчён ограниченностью языка, по сравнению с С++. Красивую иерархию наследования, без дублирования кода, сделать будет невозможно. Интерфейсы позволят сделать красивое взаимодействие, но некоторые данные, которые могли бы быть в базовом классе, придётся дублировать в разных классах, наследованных от интерфейса. Мне это не понравилось. Нужно было использовать непривычные подходы и идиомы программирования. А это уже понравилось.

Вторая книжка была уже «профильной». Я уже более-менее умел пользоваться Эклипсом, больше не плакал ночами в попытках запустить программу и научил компьютер распознавать смартфон, для отладки на реальном устройстве (тормоза эмулятора заставили меня купить простенький смартфон, так же в шкафу нашёлся планшет, бодренько перепрошитый на четвёртый Циан). Я уже читал про libGDX и, что его успешно используют для создания игр. Использовать фреймворк я всё ещё не хотел, но почитать книжку от разработчика этой библиотеки счёл правильным выбором. Я говорю о Марио Зехнере. Думаю, почитать его будет полезно каждому, кто решил программировать игры для Андроид. Читать и ковыряться в примерах было весьма интересно и познавательно. Но меня не покидало чувство дискомфорта. Всему виной идиома MVC. Годами я уменьшал связность, чтобы объекты были независимы друг от друга, чтобы знали друг о друге только то, что им необходимо и ни строчки больше. Тут же всё было вывернуто с точностью до наоборот. Сразу оговорюсь, что производительность меня совсем не волновала. Я точно знал, что игра будет настолько не требовательной, что её потянет любой смартфон вне зависимости от того, насколько корявый код я напишу. И мне хотелось написать красивый код, чтобы мне было приятно на него смотреть, чтобы было приятно читать. Мне было противно смотреть на то, как в одной огромной функции совершенно разные объекты рисуются в строго заданном порядке совершенно разными способами. Объект «V» должен был знать о каждой сущности в системе и уметь её рисовать. Это хорошо с точки зрения производительности, но мне было неприятно. Я привык, что только сам объект знает о том, как себя рисовать. Вызывающий код может лишь предложить объекту нарисовать себя. Или уточнить, не столкнулся ли один объект с другим. Или ещё что-то в таком духе. Глобально все объекты взаимодействуют через абстрактные интерфейсы и ничего друг о друге не знают. Так проще расширять, да и отлаживать. Не всегда, но обычно так проще. По крайней мере мне. Так что, несмотря на моё восхищение библиотекой libgdx я по прежнему решил писать всё с нуля. Некоторые главы я читал не внимательно, поэтому расправился с книгой за вечера полутора недель, не написав ни строчки кода. Но уже составил некоторое представление о том, какой будет архитектура моей будущей игры.

Прежде, чем приступить к программированию, я решил уладить все сопутствующие вопросы. Игру ведь надо как-то донести до потенциальных игроков, поэтому я зарегистрировался на 4pda и отправился платить гуглу. Оба пункта прошли как по маслу, всё было довольно просто и понятно и не заслуживает дальнейшего упоминания. А вот с монетизацией случился фэйл. У меня никак не получалось привязать карту к аккаунту продавца. В итоге, в техподдержке мне ответили, что не могут привязать рублёвую карту, но я думаю, что дело было в использовании Visa Electron, которая сильно ограничена в функционале. Я пытался создать долларовую карту, но СберБАНК не справился с задачей и дважды за три месяца испортил карты при активации, так что я забил на аккаунт продавца (честно сказать, серьёзно о прибыли я не задумывался и просто хотел сделать всё по правилам). В процессе мытарств с картой я приступил к программированию.

Как раз наступили Новогодние каникулы и я намеревался провести их с пользой для игрового сообщества. Т.к. десяти праздничных дней было недостаточно, к ним же я присоединил 28 дней отпуска. К этому моменту у меня был придуман логотип моей нано-корпорации и никаких идей на счёт самой игры. Мозговой штурм с постоянным одёргиванием от нереализуемых идей привёл меня к созданию игры meMlody. Мой внутренний программист и здравый смысл сошлись на мнении, что сперва нужно написать что-нибудь максимально простое, чтобы не отбить желание. Я вспомнил игру с поиском парных картинок. Она элементарно программируется и я не ожидал с ней никаких подводных камней. В целом, на счёт программирования я оказался прав. Альфа-версию я написал буквально за четыре дня. Писал, основываясь на воспоминаниях о libgdx и делая наоборот. Получилось! Игра в принципе работала, почти не зависая. Но мне она не понравилась: графика была позаимствована в интернете, а звуков вообще не было. При попытке придумать звуки для игры я придумал новую концепцию. Новый геймплей! Новое слово в игростроении, не побоюсь этого восклицательного знака! Я решил отказаться от парных изображений и стал искать парные звуки. Ничего подобного я найти не смог, поэтому считаю это личным изобретением — медальку мне. Звуки записал с какой-то октавы синтезатора. В первой версии у меня было десять пар кнопок и всего семь звуков, так что некоторые попадались чаще других, что сильно упрощало игру. В последующих версиях я расширил набор на полторы каких-то октавы и нарисовал более симпатичную графику. Даже выбор из нескольких инструментов сделал, вдруг кому-то пригодится… Это была очередная моя ошибка.

Когда счётчик скачиваний перевалил за пару сотен, а чувство эйфории немного стихло, во мне проснулся капиталист и потребовал прибыли. Делать нечего, я стал придумывать платную версию. Изначально я даже не думал о монетизации, делал игру ради процесса, поэтому мне было нечего продавать — весь функционал был открыт. Я добавил межстраничную рекламу в бесплатную версию и выпустил платную версию без рекламы. Вы не поверите, но игру купили! Целых 10 раз. Более того, игра была в пятёрке лучших игр в музыкальной категории, да. Из всех десяти представленных игр… Чтобы как-то более серьёзно разделить бесплатную и платную версию, я добавил возможность смены звукового набора в платной версии. Это не сильно меняло геймплей и на продажах никак не сказалось. В итоге я решил не быть букой и сделал бесплатную версию полнофункциональной, оставив только межстраничную рекламу. Это могло бы принести прибыль, если бы я не допустил ещё одну ошибку.

Для неизвестного разработчика весьма проблематично попасть в Топ25 в категории. А если вы в Топ25 не попадёте, то сложно рассчитывать на большое количество установок (просмотры рекламы -> клики -> горы золота). Попасть туда реально только в первые недели после публикации нового приложения. Нужно сразу же публиковать рекламу игры везде, где сможете. На форумах, в чатиках, во Вконтактике и ЖЖ, чтобы все ваши многотысячные френды скачали игру и восхищались её, тыкая в пятизвёздье и оставляли отзывы. Ну, это в идеале. В реальности можно рассчитывать на пару сотен установок и десяток комментариев. Этого не хватит для попадания в Топ. И тогда вы можете захотеть купить установки в каком-нибудь специализирующемся на этом сервисе. Сделайте это! Потом будет дороже и бесполезно. О раскрутке я подумал спустя где-то три месяца и пару релизов после публикации, когда заметил, что выше 200 места в общем рейтинге подняться не получается и установки совсем не растут. Тут нужно быть два раза честным. Во-первых, meMlody весьма специфичная игра, о широком круге пользователей которой и речи быть не может. Тысячи её установок я считаю чудом и излишним любопытством геймеров. Во-вторых, «раскручивать» я решил вторую свою игру. Она была более ширпотребная и чуть более сложная в реализации — уничтожение групп блоков одного цвета. Из нового и оригинального только то, что блоки падают не вниз-влево, а сваливаются к центру экрана — это удобнее с точки зрения тыкания пальцами. Отзывы с 4pda подсказали о необходимости сделать менее вырвиглазный интерфейс, но в целом были вполне не обидные. Поэтому я добавил в игру ещё пару режимов (с классическим падением блоков и с бесконечными блоками) и перерисовал интерфейс. Ошибка была в том, что рекламировать игру за деньги (покупая установки) я стал слишком поздно, когда игра уже не могла попасть в новинки. Тут нужно было покупать тысячи установок, я же купил буквально две сотни (пожадничал тратить много денег на баловство). Временно график резко возрос, звёзд и положительных отзывов прибавилось, но мне не удалось попасть даже в первую сотню. Ни о каком лавинообразном росте установок и речи не было.

Третью игру я написал всего за пару дней, половину из которых потратил на графику. Изначально не планировал её монетизировать, поэтому даже встроенную рекламу делать не стал. Выпустил её ко дню Святого Валентина (недели за две), но её никто не нашёл и не скачал. За девять месяцев набралось чуть более 500 скачавших (оставивших игру было гораздо меньше), зато в отзывах написали о маленькой девочке, которая только в мою игру после детского сада играет, чему я безмерно рад и считаю, что игра выполнила своё предназначение — принесла радость ребёнку. И мне.

С умным видом даю полезные советы

  • Сперва продумайте, что за у вас будет игра и, захотите ли вы сами в неё играть. Если даже разработчик не играет в свою игру, то...
  • Не пишите всё сами! Нет, реально. Я всё понимаю, честно. Сам такой же. Но не повторяйте моих ошибок. Потратив время на изучение libgdx или unity вы получите гораздо большую отдачу за меньшее время и с меньшими усилиями. Написав игру с нуля вы получите удовольствие. Получите маленький файл игры. Сможете сказать «слабаки, я вот всё сам написал». Только вот на это уйдёт больше времени и вам будет сложнее делать всяке прикольные плюшки. Даже редактор уровней придётся самому делать, например. Я осознал свою ошибку, раскаялся и скачал Unity3D. Хочу получать удовольствие с комфортом, а не от чёрного БДСМ с Java отладчиком.
  • Сделайте простенький сайт-визитку и забудьте о нём на как можно больший срок! Пусть он будет сделан в конструкторе сайтов со стандартным шаблоном или свёрстанным за вечер хэтээмэльчиком — не важно. Оставьте сайт в покое как можно скорее. В идеале, сайтом должен заниматься кто-то не вы. За этот год я шесть раз переделывал сайт, потратив на него времени в несколько раз больше, чем на все три игры. Дважды конструкторами хостера, дважды использую офлайн-CMS и дважды писал на HTML ручками. Остановился на ручном варианте, хотя он до сих пор плохо отображается на смартфонах. Сложно заставить себя бросить дорабатывать сайт, если ты не знаешь ни HTML, ни CSS, ни основ дизайна. Мне понравилось, даже очень. Но за это время я мог запрограммировать пару-тройку игрушек. Не надо так.
  • Попробуйте нанять копирайтера. Или подружиться с тем, кто называет себя копирайтером и согласен написать вам пару абзацев текста за печеньки. Я страдаю болезнью программистов и выражаюсь либо кратко, сухо и по существу, либо устраиваю вынос мозга хаотичным потоком бессвязных слов. За целый год я так и не смог написать красивое описание для игрушек. В следующий раз попробую нанять копирайтера, если у игры будет хоть какой-то потенциал.
  • Наймите SEO оптимизатора. Не сумев написать нормальные обзоры для игр я догадался, что с SEO оптимизацией мне лучше не связываться. Написав что-то в ключевых словах я напрочь забросил эту тему, получив ожидаемый результат в виде околонулевых посещений сайта. Не поленитесь уделить поисковой оптимизации чуть больше времени, чем изначально на это планировали.
  • Заранее думайте о монетизации приложений. Хотя бы о межстраничной рекламе (баннерам я говорю «фу!»). Лучше о внутриигровых продажах, это более выгодно, если игра привлечёт внимание. Потом будет гораздо сложнее или вообще невозможно этого сделать.
  • Попробуйте нанять какого-нибудь начинающего хдожника-дизайнера, чтобы он нарисовал вам логотип игры. Как бы я не восхищался своим фотошоперским мастерством, следует признаться, что дизайнер троечник нарисует лучше и быстрее. Ещё лучше, если всю графику для игры нарисует тот, кто умеет рисовать. Или думает, что умеет. Музыки и звуков это тоже касается, но цена вопроса такова, что проще самому из бесплатных сборников что-нибудь надёргать.
  • Моя самая большая ошибка — отсутствие социализации. Для программиста-интроверта это хорошо, для игр — плохо. Я не сомневаюсь, что «Цветные блоки» были бы гораздо популярнее, если бы рекорды хранились не локально, а вёлся рейтинг всех игроков, чтобы можно было соревноваться и хвастаться. Система достижений (ачивок) тоже будет несомненным плюсом. Я планировал добавить кросспостинг рекордов и достижений в фэйсбук и вконтакт, но так этого и не сделал (на третий раз переписывал сайт). Настоятельно рекомендую в первой же версии делать глобальный рейтинг игроков, ачивки и «поделиться в соцсетях», это самый лучший способ раскрутки приложений и совершенно для вас бесплатный. Ачивки должны быть красивыми, чтобы игрокам было не стыдно повесить их у себя в ленте, так что перечитайте предыдущий пункт. Хочу напомнить, что делая всё с нуля, и рейтинги-ачивки придётся писать на GoogleAPI, VKAPI и прочих API. Используя готовую библиотеку или модуль вы потратите гораздо меньше времени. Я лишь успел научиться посылать текст на стену вконтакта, но для отправки картинок требовалось гораздо больше действий, плюс асинхронные запросы, плюс много чего ещё, что я предпочёл проигнорировать. А зря.

Один короткий вывод

За это время я понял, что мне недостаточно просто программировать игры. Мне хочется, чтобы в них играл кто-то ещё, кроме меня. А сделать игру достойного качества очень и очень сложно, особенно в отсутствии хорошей идеи. Готовые движки и конструкторы существенно упростят и ускорят создание игры. Да, вы будете в какой-то мере ограничены в возможностях, но большинство даже не узнает о наличии этих ограничений. Поэтому я решил изучить Unity3D. Если, вдруг, что-то будет меня сильно сдерживать и ограничивать полёт фантазии, всегда можно запустить Эклипс и написать всё с нуля. Любую из моих игр можно было сделать буквально за день, у меня же ушли месяцы. А всё из-за нежелания использовать «чужой» код и конструкторы. Я осознал и признал свои ошибки и постараюсь исправиться =^^=
Сейчас я прервался ради другого проекта, но обязательно вернусь к программированию игр и следующая будет написана в Unity, ведь ни C#, ни самого юнити я не знаю, а, значит, это очень интересно!

Спасибо, что дочитали до конца. Я знаю, что не рассказал ничего нового, поэтому расценивайте мой опыт, как подтверждение прописных истин и не бегайте по граблям — они мои.
Почему тэг «история успеха»? Потому что я приобрёл много опыта и считаю это большим успехом. И тэга «я вон с теми неудачниками» не высветилось.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js