Undead Hunter - как потратить годы на разработку
Собратьям привет!
Допилил на днях игру, зарегистрировал на Greenlight (ссылка для интересующихся - в конце), и по совету другана решил накатать статейку на тему «Как это было». И вам интересно, и я не забуду.
Как положено, по ходу написания игры была совершена масса ошибок (возможно, все?), а поэтому вдвойне интересно.
Получился длиннопост, предупреждаю сразу.
1. Идея игры и начало
Я так стар, что ещё помню некоторые древние игры (те, которые пока не вытеснил из мозга склероз), и одной из них является игра, где нужно стрелять вверх непонятной штуковиной типа цепи, разбивая то ли прыгающие шары, то ли пузыри на более мелкие до тех пор, пока не прикончишь самые мелкие. Вот так она выглядела:
Скринов оригинала не нашёл, так как не помню называние, так что придётся поверить мне на слово - лет 25-30 назад такая игра была.
И вот, давно-давно, когда игры ещё писали на платформу J2Me, мне пришла в голову идея сделать что-то своё на эту тему, но только с блэкджеком и всем остальным. Сказано-сделано. Потратив немножко денег (на самом деле немножко), у знакомого художника из были заказана графика и вот что получилось:
Игра была довольно успешной в своё время, поэтому решено было возродить, так сказать, классику. На самом деле до этого была ещё одна игра на эту тему, «Alien World», но её я не смог уже отыскать на просторах интернета, а в старых архивах копаться уже не хочется.
Так вот, было решено запилить что-то подобное на модный тогда iPhone.
Был написан прототип на имеющийся на руках iPod. Самым нормальным движком на тот момент мне показался Cocos2d (который на Objective-C) - уж не знаю, жив ли он ещё? Забегая вперёд, скажу, что остался верен (почти) ему до конца, и, благодаря ему, игра сейчас работает на всём, что шевелится, включая Linux и даже Windows Phone.
Получив рабочий прототип с жутким управлением (мне казалось, что наклонять телефон очень удобно для управления 2d-персонажем), тут же вместе с сотрудниками занялся генерацией идей. Идей был реально миллиард, но немногие из них дожили до сегодняшнего дня.
Прототипировать было легко, потому что были какие-то монстры уже из старой игры, персонаж (графика для начала - это очень важно) и горящая сера в одном месте. Ну и желание прославиться и захватить мир, конечно.
Однако, к сожалению, на тот момент опыта в гейм-дизайне было маловато, поэтому всё постепенно заглохло. Так всегда бывает, когда работа не разбита на этапы, задачи, и не используется баг-трекер. И когда ты точно не знаешь, сколько уровней у тебя будет - 100 или 30 или 700. Сколько монстров, персонажей, видов оружия. Будут ли достижения, бонусы, коллекционные медальки? Будет ли сюжет? Короче, нет цели - нет результата. Всё расползалось вширь, но каждая отдельная фича игры не доводилась до конца.
Постепенно игра обросла новой графикой, заказанной уже у брата первоначального художника, так что имеется некая преемственность безумия персонажей и монстров. Многие монстры переехали как есть.
На одном прототипе не уедешь, как оказалось. По наивности я даже пытался показать игру издателям, но на тот момент я не знал умных слов вроде «learning curve» и не понимал, почему мне все отказывают. А ларчик просто открывался - игра была настолько хардкорна, что кроме меня никто не мог пройти даже второй уровень и понять в чём собственно суть игры. А «обучение» было только в сопроводительном письме. Музыка в игре была на тему heavy metal, что для продюсеров тоже как-то не очень обычно. Ну и в завершение пиксель-арт, когда модно стало рисовать Ом-Номов (при всём уважении) и прочих крокодилов Свомпи.
2. Графика
Графика да, была пиксельной. Но не вся. Задники очень даже не пиксельные. Я не помню как так вышло. Возможно, задники в пиксель-арте требуют гораздо больших трудозатрат? Но всё, что на переднем плане было отрисовано в пикселе, а всё, что на заднем… не знаю, как это называется у художников, короче - обычно.
Это хорошо пошло вместе, создался некий контраст, когда ты отделяешь то, что происходит на переднем плане от фона. Так что решено было продолжать в этом же духе. А возможно повлияло то, что игра делалась изначально на древние сейчас уже устройства, где разрешение экрана позволяло выводить пиксель-арт один к одному и он не сильно отличался от задников. Но потом появилась retina, и понеслось. Отчасти это тоже было сильно демотивирующим фактором - видеть, как все переходят на высокое разрешение графики, а ты со своим пиксель-артом остаёшься на обочине.
Художник нам попался мега-творческий. Монстры и задники получались как надо, с нужным накалом безумия. К сожалению, в то время игра так и не была дорисована до конца, так как мы переключились на другой проект, за который нам обещали заплатить денег.
Кстати, ролик той игры (из далёкого 11го года) у меня ещё сохранился на Youtube, так что выкладываю на посмотреть. В принципе, отличия от сегодняшнего дня видно. К сожалению, отсутствие рейтинга не даёт выложить ролики, поэтому желающие могут ознакомиться по ссылкам.
Старый ролик 2011 года: https://youtu.be/ZWReHsbWvRI
Новый ролик 2016 года: https://www.youtube.com/watch?v=xbAO7kXsCSI
Много картинок выкладывать не буду, при желании можно посмотреть скрины на страничке в greenlight (ссылка, напомню, внизу).
3. Код, движок и всё такое
Движок, как уже говорилось, был выбран Cocos2d. Особенностью той первой версии было то, что он был адски глючный. Глюки находились почти во всём. И тогда не было моря китайцев, пишущих на Cocos2d-x, которые могут помочь практически во всём. Одним из самых дурацких решений на тот момент было то, что я стал делать физику в игре самостоятельно. Поначалу мне это почему-то показалось хорошей идеей. Но по мере того, как игра расширяясь в плане функционала, стали вылезать проблемы. А добавилось вот что:
- Монстры и персонажи, в отличие, от прообраза перестали быть кругло-квадратными, поэтому попадания в них стали выглядеть коряво
- Уровни усложнились, появились лестницы, более комплексные платформы
- Появилось оружие с разными принципами действия
- Появились частицы
В результате всё было так ужасно, что персонаж постоянно куда-то проваливался, застревал, монстры не убивались. И совершенно нереально было всё это исправить, так как была накопипастена была куча говно-кода по всему проекту.
И вот однажды я осознал свою тупизну и просто забросил проект, переключившись на что-то другое по работе. Совместно с причинами, которые озвучил ранее, конечно.
Ещё несколько проблем того периода:
- Я не додумался (поленился?) по-нормальному сделать редактор уровней. Прототип был, напомню, на мобильный девайс, поэтому делать на нём уровни было невозможно, сохранять их было некуда. Был написан кривенький редактор, очень неудобный, уровни делать и тестировать было невероятно неудобно.
- Я не знал толком Objective-C и поверхностно представлял себе суть объектно-ориентированного программирования.
- Я писал говно-код, волшебные числа и допущения были повсюду
- Строки с текстом прямо в коде, я делал диалоги прямо на картинках в фотошопе (с соответствующими трудозатратами на исправление/локализацию)
- Я считал, что мой английский прекрасен, а шутки на нём остроумны
- Я предпочитал копипаст тому, чтобы писать более универсальный код на все случаи жизни.
4. Эпоха возрождения
Прошли годы (реально годы, блин), мы с командой работали над портированием проектов с платформы на платформу (кому интересно - добро пожаловать на сайт с портфолио), мы работали на всех платформах, которые можно представить. Портировали и хороший код, и такой, как был у меня раньше. Поработали с хорошими продюсерами, нормально поставленной системой баг-трекинга, постигли дзен, в общем.
Было принято волевое решение написать всё нафиг заново. На Cocos2d-JS. Да, HTML5, Javascript. Чтобы веб и можно было портировать на всё остальное. Было потрачено некоторое количество времени (недель), была выкачена версия, с которой мы съездили на DevGamm2015 в Минск.
Получили полезные отзывы у себя на стенде и почти победили на GameLynch. Это такое событие, когда твою игру полчаса уничтожают эксперты, доказывая, что она редкостный трэш и шлак, а у тебя есть 5 минут, чтобы защититься. Аудитория голосует и проигравший выпивает мощную дозу алкоголя.
В результате мы с ещё одним парнем вырвались в финал. Финальным испытанием, чтобы определить победителя из нас двоих, было метнуть плюшевого медведя в зал как можно дальше. Мой медведь пошёл низко, и я зарядил какому-то парню прямо в щи. Так что я проиграл. Братан, извини, если ты это читаешь, я не виноват, мне сказали не попасть в мера-дорогие люстры. Я выбрал тебя.
Воодушевлённый я примчался к родным пенатам и решил опробовать игру на разных платформах и выпустить уже наконец. И жёстко обломался. Оказалось, что использованный в игре Box2d не был портирован китайцами настолько, чтобы можно было собрать нативные версии на мобильные платформы. То есть в вебе и на PC всё шуршало, а вот на Android не собралось, и на iOS не собралось. А то, что собралось после отключения физики работало с частотой до 10 кадров в секунду. Это был как удар по самому дорогому. Но нам ведь не привыкать! Ну и плюс игра на HTML5 нафиг никому не нужна.
С нового года (конфа была в ноябре, а декабрь был загружен работой) сера в одном месте чудесным образом обновилась, и всё было переписано на C++. Работал я параллельно с основной работой, поэтому растянусь на несколько месяцев. Плюс 2 месяца был в поездках.
Но наконец-то я:
- Написал хорошие классы для интерфейса, новые окна, кнопки и в целом интерфейсы стало делать легко и приятно
- Написал чудный класс монстров, наследовать от которого, расширяя возможности новых монстров, стало удовольствием
- Реализовал локализацию всего по-красивому, в отдельных файлах
- Повсюду появились синглтоны SaveManager, ControlsManager, SessionManager и другие, обращаться к которым стало очень легко и приятно из любого места кода
- Подключил нормальный генератор частиц (пришлось купить ParticleEditor)
- Сделал, наконец, нормальные шрифты (пришлось купить GlyphEditor)
- Мощно ускорил всё, собрав атласы (пришлось купить TexturePacker)
- Написал хороший встроенный редактор, с помощью которого можно было тут же затестировать уровень, подредактировать что-то на лету.
- Избавился от всех волшебных чисел, всё либо в файле констант, либо в конфигурационных файлах
- Монстры получили честные формы, повторяющие их спрайты
- Графику стало можно отключать, оставляя на экране лишь физику
- MovieManager, который умеет управлять персонажами и врагами, позволил сделать кучу роликов на движке - диалоги или мультики появились в каждом уровне!
А вообще, писать на C++ - это невероятно приятно. Даже с учётом того, что приходится делать это в XCode (к сожалению в данном случае, дома и на работе Mac).
Ну и масса более мелких улучшений имела место. Плюс ответственно подошли к тестированию внутри конторы, перепроходили игру многократно с занесением багов в трекер.
5. К чему всё пришло и что дальше?
Правильный вопрос задаёшь, пытливый читатель. Это всё было месяца 2-3 назад. Труд, который я вложил в переписывание начисто принёс плоды. Всё работает как часы, не глючит. Но стало легко добавлять в игру новое и я развернулся:
- добавил массу задач для каждого уровня
- поскрёб по сусекам, нашёл всех неиспользованных пиксельных монстров за все годы работы и внедрил. Правда, парочка осталась. Пойдёт в дополнение.
- добавил все имеющиеся задники, правда, кое-что пришлось дорисовать
- добавилась онлайн-таблица рекордов
- друг-американец помог с переводом на английский
- нормальное управление для тач-скрина
- сборки на все платформы, как настольные, так и мобильные
- безжалостно уничтожено то, что не было доделано
- была написана спецмузыка другом-музыкантом
Всё добавлялось так быстро и легко, что пришлось наложить резолюцию и закруглиться для выхода игры. Масса идей осталась на будущее, конечно.
На заре времён задумывался мега-сюжет, но в результате всё пришло к абсурдной истории (намеренно абсурдной). Из интересного добавилось в конце:
- сюжет (диалоги и ролики) немножко зависит от того, кем играешь - мужиком или девчонкой.
- бессмысленные ранее медальки за задания на каждом уровне теперь ограничивают доступ к 4м боссам
- всё это встроено в сюжет, диалоги меняются в зависимости от внешних условий
Что дальше?
А дальше голосование на Greenlight. Ссылка вот: http://steamcommunity.com/sharedfiles/filedetails/?id=814871...
Сборка на Windows Phone залита на стор, зарелизится как только удастся сделать красивые скрины. Те, что у меня есть, как оказалось, смотрятся на витрине паршиво. Занимаюсь этим прямо сейчас. Знаю-знаю, платформа маргинальная, но такой мобильник есть у самого - проще тестить, плюс будет вроде как пробный пуск.
После этого выгружу на мажорные платформы, но уже, наверное после Нового Года. Единственное, чего там сейчас не хватает - это in-app и достижения. Да, игру придётся покупать, но она просит денег после прохождения 12 уровней и убийства первого босса. Всё по-честному, понравилось - купи, никакого выкачивания денег на какие-нибудь улучшающие кристаллы.
Вот и всё. Если есть вопросы - пишите, с удовольствием отвечу.