Если бы в 2010 году меня спросили «Как сделать собственную компьютерную игру?», я бы застыл с растерянным видом. Сейчас на дворе 2016 год, у меня по папкам распихан десяток наколеночных поделок, и я уже могу робко промямлить варианты ответа.
13 мая вышла моя первая flash-игра «Hold the Fort!». О том, как я до этого докатился, хочу вам рассказать.
Рассказ будет состоять из 3 частей. Зачем так много?! - воскликнет читатель. Зачем вообще про это писать?! - воскликнет другой. Ответ прост: тщеславие. Не для того я, знаете ли, вёл дневник разработки, чтобы он гнил вместе с остальными отбросами нереализованных увлечений. Вдруг вся эта писанина вдохновит какого-нибудь горячего юнца на разработку игр? Ну, или хотя бы Blizzard возьмёт меня на работу.
Дизайн
В 2009 году я решил создать настольную игру. На волне энтузиазма напридумывал таковых пару десятков, а для некоторых даже сделал большие цветные карты из плотной бумаги и фигурки из плексигласа. В конечном счёте, все они благополучно отправились в стол.
01) Фишки к одной из игр
В какой-то момент я обратил внимание, что для многих моих настольных игр от ведущего требовались слишком сложные расчёты. Это привело меня к идее сделать компьютерную игру.
В 2013 году я частенько поигрывал во вские мелкие игрушки в интернете, поэтому выбор пал на flash как на что-то знакомое хотя бы с точки зрения потребителя. Лучший способ обучения - созидательный, поэтому вместо штудирования уроков я сразу пустился в пляс по граблям разработки собственной игры.
Общая концепция была следующая (см заглавную картинку): фэнтезийный сеттинг, вид сбоку, слева стоит башня, на ней сидит лучник, управляемый игроком, и несколько лучников-помощников, стреляющих самостоятельно. Справа к башне идут монстры, лучники осыпают их градом стрел. Это ночью.
Днём же, пока монстры спят, обитатели крепости занимаются всякими полезными делами: тренируются, варят зелья, чинят крепость или просто дрыхнут.
02)
Единственный ресурс в игре - энергия обитателей крепости. Ночью они тратят её на стрельбу и ремонт, днём - на разные действия. Таким образом, в спиномозговую стрелялку вносится элемент менеджмента. У лучников есть параметры: сила, выносливость, меткость и перезарядка, которые можно прокачивать.
Итог по дизайну:
Придумывать игру - самая интересная и лёгкая часть работы. Переходим к коду.
Код
С 2010 по 2013 год я слепил несколько поделок при помощи конструктора Game Maker. Но хотелось более глубокого понимания и контроля процессов, поэтому я приступил к поиску языка программирования, который был бы прост в освоении и подходящ для написания на нём игры. Написав пару прототипов с использованием Lua на движке
Löve, в 2013 году я познакомился с языком программирования ActionScript 3.0. С его помощью я рассчитывал быстренько смастерить flash игру и залить её на какой-нибудь веб-портал типа ArmorGames или Kongregate. «Быстренько» растянулось на 2 года, в течение которых, да и по сей день только ленивый не «хоронил» технологию Flash. Но когда меня впервые достигло эхо этих поминок, отступать было поздно, поэтому пришлось донекрофилить до победного.
Из любопытства я стремился использовать максимально чистый код, без всяких сторонних библиотек и движков. Свои велосипеды быдлокодить дольше, но гораздо интересней. К счастью, я довольно скоро наткнулся на чудесную программу
FlashDevelop с блэкджеком и шл подсветкой синтаксиса, автозаполнением и дебаггером. Благодаря ей я практически с самого начала писал код в классах, а не в кадрах: это давало мне неограниченный контроль над всеми создаваемыми процессами, а также тешило самолюбие моего внутреннего недопрограммиста. К уже знакомым словам вроде «переменная» и «скрипт» добавились заклинания «класс», «цикл», «наследование», «слушатель события» и т.д.. Всё это было очень непонятно и увлекательно.
Самым ударным был первый месяц, в течение которого была готова основная механика игры: лучники научились стрелять, враги - двигаться и атаковать, а стрелы - летать (с учётом силы трения и гравитации) и втыкаться в супостатов и землю. Затем я сделал экраны игры (до сих пор, со времён GameMaker называю их «комнатами») и систему перехода между ними, простейший интерфейс (полоски здоровья, кнопки, сообщения и т.д.), систему сохранения-загрузки через Shared Objects, добавил лучникам параметры и систему их прокачки, начал работу над экономической системой.
Дальше пошли ленивые перерывы, полировка, сомнения и попутно дальнейшее изучение возможностей ActionScript. Весь 2014 год я занимался техническим совершенствованием той основы, которую слепил в первые 3 месяца разработки, а также работал над балансом и оптимизацией. Возможно, с последней я поспешил, но зато сразу привыкал стараться писать читаемый и быстрый код (например, использовать векторы вместо массивов, всегда указывать типы переменных и методов, использовать int вместо Math.floor, не использовать анонимные функции и т.д.).
В процессе написания кода приходилось постоянно задавать дурацкие вопросы на форумах, копаться в книге Мука (Essential ActionScript 3.0. Colin Moock, 2009) и учебниках по геометрии. Чем больше я углублялся в разработку игры, тем яснее я понимал, что увяз в трясине стремления к совершенству, что само по себе неплохо, но отодвигает дату завершения в бесконечность. В подобной трясине я оказался и при написании этого раздела про код, надо срочно из неё выбираться, поэтому про код всё.
Итог по программированию:
Теперь я заранее представляю себе архитектуру проекта и могу написать простенькую игру с нуля, без консультаций на форуме (подглядывание в куски кода из предыдущих проектов не в счёт).
В следующей части речь пойдёт о графике и звуковом оформлении игры, картинок будет чуть больше.
Ссылку на игру дам в заключительной части.
Остальные части:
> Часть 1 - Дизайн и код
Часть 2 - Графика и звук Часть 3 - Перевод и итоги Содержание всего блога