Game Design 101

Так получилось, что последние несколько месяцев я был абсолютно оторван от мира игр. Набирался опыта на поприще сайтостроения и проектирования полнофункциональных систем разного уровня сложности. Несмотря на то, что деятельность эта не связана с интерактивными развлечениями, в основе своей принципы построения программных продуктов могут иметь много общего.

И основной принцип, как ни странно, всего один: для реализации любого проекта необходимо тщательно продумать все его детали, создать подробный завершённый дизайн-документ. Чертёж, если обращаться к аналогии из инженерного ремесла. А дальше дело останется за вашим опытом, инструментами и технологиями.

Удивительно, но эту простую истину, которая отличает реализованные идеи от идей, постоянно болтающихся в долгом ящике, я осознал и взял на вооружение всего несколько месяцев назад. Так что пришло время пересмотреть подходы к реализации своих задумок и попрактиковать более «стратегический» подход.

Временная шкала разработки игрового проекта
Переходить от первого этапа сразу к третьему – весьма опрометчивое решение

В игровом деле разработка идеи начинается с гейм-дизайна. Капитан Врунгель пел: «Как вы яхту назовёте, так она и поплывёт…». Перефразируя под наши нужды: «Как вы дизайн-документ составите, так и ваша игра выйдет в релиз». Или не выйдет, если план будет составлен по-дилетантски. После некоторых поисков в руки мне попалась замечательная книга, посвящённая созданию этого самого плана – Games, Design and Play: A detailed approach to iterative game design (Colleen Macklin, John Sharp). Изюминка в том, что параллельно авторы рассматривают множество сопутствующих концепций: философию, психологию, динамику игр. Разбирают их по винтикам и шпунтикам.

Games, Design and Play: A detailed approach to iterative game design (Colleen Macklin, John Sharp)
С первых страниц понятно – замечательное исследование

Без воды и лишних предисловий уже в первой главе получаем выжимку базовых элементов любой игры:

  • Действия – активности, которые проявляет игрок, пытаясь достичь целей игры.
  • Цели – результат, которого пытаются достичь игроки по результатам игры. Причём неважно, являются ли они измеримыми величинами или рождаются из игрового опыта.
  • Правила – инструкции о том, как функционирует игра.
  • Объекты – игровые сущности, которые игрок использует для достижения цели.
  • Игровое пространство – окружение, которое определяется правилами, и в котором происходит игровой процесс.
  • Игроки – основные действующие лица игры.

И если мы возьмём любую игру: спортивную, словесную, настольную,  цифровую – мы всегда сможем разложить её на эти ключевые элементы, работающие в связке и создающие те самые впечатления, переживания, которые заставляют нас играть снова и снова. Связкой этой служат важные концепции:

  • Дизайн второго порядка: в процессе разработки проекта игровой опыт создаётся косвенно через совокупность правил, действий и целей. Сама игра приходит в движение и обретает форму только тогда, когда в ней появляются игроки. Об этом важно помнить на любом этапе: мы создаём произведение, которое является частично «незавершённым» – нам, по сути, неизвестен его конечный вид.
  • Пространство вариантов: интерактивность даёт игрокам возможность выбирать различные действия и трактовки игровых элементов. В том время как дизайнер не может предугадать все возможные шаги и впечатления игрока, он может ограничить или расширить арсенал потенциальных вариантов, комбинируя действия, правила, цели, пространство и объекты. В противовес первому пункту, в наших руках остаются инструменты, позволяющие рассказать о нашей идее игроку. И в этом, думаю, состоит важный показатель профессионализма игрового мастера – умение найти баланс между свободой действий игрока и нарративом игровой истории.
  • Состояние игры: это моментальный снимок текущих параметров всех игровых элементов на пути игрока к целям. Это состояние постоянно изменяется в зависимости от вовлечённости игрока в игровой процесс. А сумма таких «кадров» расскажет о масштабах вашей задумки.
Коллаж из игровых персонажей
Их невероятно много. Но мы дойдём до сути и поймём, что их роднит

Ни много, ни мало, но получился краткий конспект первой главы, выборка основных тезисов. Но даже они неплохо продвигают нас к пониманию того, на каком каркасе можно построить всё здание итогового проекта. Дают структуру и необходимый метафизический минимум.

В конечном счёте, необходимо помнить, что ты создаёшь игру – динамическое произведение искусства – которое будет «оживать» в присутствии игрока, и уже от него зависит финальный вид твоего творения. Авторы обещают в последующих главах перейти от теоретических построений к более практическим советам и рекомендациям. Давай двигаться дальше!

Моделирование дорожного трафика и библиотека FollowMe

Как часто вы сидите у окна в кафе, наблюдая за суетой города? За мерцающими огнями улиц, проходящими мимо людьми, ползущими в разные стороны машинами – всё то же, что следить за пляской огня или метаморфозами воды. Не знаю, как вы, а я могу часами смотреть с какой-нибудь высотки на нескончаемое движение города.

Пришла пора рассказать вам о моём основном проекте, которым я был занят в последние три месяца (на самом деле, гораздо больше, если учитывать изучение большого количества научных работ и прошлых попыток реализации). Пожалуй, это одна из самых сложных вещей, которыми мне приходилось когда-либо заниматься. Но эта крепость больше не выглядит неприступной, и по завершении текущего цикла мне действительно есть, что показать и о чём рассказать.

Логотип для своего проекта я ещё не придумал, но только посмотрите, как притягательны эти низкополигональные модельки

В той игре, которую я планирую разработать, дорожный трафик занимает чуть ли не центральную часть. По крайней мере, это будет один из самых важных аспектов во всём дизайне игрового мира. К тому же система с таким количеством сущностей (100 000 транспортных средств для моей задумки – не предел) сама по себе является достаточно сложным программным проектом, реализация которого может неплохо поднять уровень навыков да и вообще быть показателем того, насколько мои идеи реализуемы.

Поэтому сейчас я работаю над модулем, позволяющим создавать транспортные сети любых конфигураций и моделировать дорожное движение на них. Представьте себя инженером автодорожного профиля, проложите несколько магистралей, создайте между ними развязки и пересечения, запрограммируйте светофоры. А потом просто наблюдайте, как виртуальные легковушки, автобусы, грузовики и трамваи пытаются пробраться через ваш лабиринт, следуя из точки А в точку Б. Уже сам по себе этот танец способен заворожить, даже без цели и смысловой нагрузки.

Follow Me library traffic jam
Не успели выехать на улицы, как тут же встали в виртуальные пробки. Реализм!

Надо сказать, что реализуемая мной идея далеко не нова – самые ранние публикации на тему компьютерного моделирования трафика, которые мне довелось изучить, датировались началом 80-х годов. С тех пор появилось множество наработок в этом направлении, но все их можно разделить на три большие подгруппы: макро, микро и гибридные. В макро, как следует из названия, мы опускаем индивидуальные детали каждого транспортного средства и пытаемся сформировать некий общий поток, как если бы наши магистрали были трубами, а потоки машин потоками воды. Я не шучу, многие макромодели используют в качестве основы законы гидродинамики. В противоположность им ставятся микромодели, где моделируется поведение отдельных сущностей в зависимости от дорожной ситуации, особенностей транспортного средства и характера водителя. Здесь основу составляют following-модели (модели следования, то есть большую часть времени мы ориентируемся на следующее впереди нас ТС). Здесь сразу напрашивается очевидный плюс этих систем: более точное моделирование с учётом индивидуальных особенностей. К сожалению, это требует и бОльших расчётов – для крупных сетей такие модели не всегда подходят (особенно для моделирования в реальном времени). Поэтому существуют гибридные модели, объединяющие два этих подхода. Ведь, по сути, большую часть времени машины движутся в общем потоке, который мало отличается от потока воды, а на перекрёстках мы просто переходим к индивидуальным моделям. Из минусов – сложность разработки таких систем. По крайней мере, с моим текущим уровнем математики мне пока что не удалось создать в голове чёткого понимания их работы.

Follow Me library with debug info
Отображение технической информации позволяет отследить детали, важные для создания и функционирования сетей

Как видно из названия моей библиотеки, я выбрал в качестве основы модель следования. В самом простом понимании эта модель рассчитывает ускорение транспортного средства в конкретный момент времени t. И всё. То есть мы берём наши сущности, рассчитываем для каждой ускорение в зависимости от окружающих условий. А, узнав ускорение, вычисляем скорость и положение в некий последующий момент времени t+Δt. И «перемещаем» глобальное время на эту позицию. Чтобы повторить всё то же самое снова.

И всё было бы просто, если бы весь мир стоял на одной единственной очень длинной дороге шириной в две полосы. Но ведь есть ещё перекрёстки, светофоры, дорожные знаки, многополосное движение, парковки, непредсказуемые пешеходы, велосипедисты и неопознанные летающие объекты. Они-то и вносят всю смуту в нашу стройную систему. И простая following-модель превращается в массивного динозавра, который должен учесть множество дополнительных факторов, прежде чем наше авто перепрыгнет в своё счастливое Δt-будущее.

Им ещё многому предстоит научиться. Но хотя бы не сталкиваются, уже хорошо!

На текущий момент я уже более-менее разобрался со скоростным режимом полос, приоритетами, перекрёстками, светофорами и стоп-линиями. А также добавил возможность формировать составные ТС (ведь трамваи и грузовики могут состоять из нескольких частей). На повестке дня – параллельные перестроения. Крепкий орешек, который затрагивает практически все аспекты моделирования. Многие части уже написанного кода, в которые оно обещало хорошо вписаться, на деле оказались неподготовленными, и подвергаются переработке. Причиной тому некоторые преждевременные оптимизации (никогда не начинайте оптимизацию прежде, чем у вас будет готов рабочий прототип – успеется!). А также наивная уверенность в том, что простые прикидки в уме позволят в будущем подружить существующий код с крупной партией новых возможностей. Но, в целом, всё не так уж печально. Ведь мои подопечные хоть и с неохотой, но всё же начинают перестраиваться в новые полосы, расталкивая конкурентов и устраивая опасные ситуации.

Сейчас рано говорить о дате релиза библиотеки, но она обязательно будет иметь модуль интеграции с движком Unity, доступный на Asset Store. Чтобы получилось многофункциональное решение для внедрения в любой игровой мир масштабной транспортной сети. Кому-то это позволит оживить статичное окружение, добавить очарования или даже написать свою собственную стратегию. Но ещё больше я надеюсь на то, что мой проект поможет в дизайне реальных транспортных систем и решении проблем городского трафика. Ведь, пусть он и реализован в игровой форме, весь его фундамент заложен на научной основе. Как и во многих других проектах индустрии. Так что никогда не стоит сбрасывать игры со счетов в вопросах реального мира.

Pure It!

Как-то в своём профиле в Instagram я рассказывал тебе о модификации, которую разрабатываю для компьютерной игры Factorio. Той, которая позволяет сделать игровой мир чуть лучше путём очистки воздуха. Осенью я наконец-то взял себя в руки и довёл этот мод до стадии альфа-тестирования, так что теперь он доступен для скачивания на официальном портале игры.

Bery0za's Pure It rendered machines
Рендер всех механизмов, которые мне довелось смоделировать для дополнения. Без текстур смотрится даже лучше

В процессе я неплохо поднял уровень своих навыков в Cinema 4D, в которую, кстати, влюбился (за исключением карт развёртки). Припомнил невероятно обаятельный язык Lua. С любовью и ненавистью покопался в чужом коде и документации (весьма туманной местами). А также написал пару удобных утилит, которые позволили упростить работу со спрайтами. Но давай обо всём по порядку.

Идея пришла ко мне после многочасовых игровых сессий с @softkitty___warmkitty, в ходе которых нам периодически приходилось устраивать рейды на местную фауну и её гнездилища. Весьма агрессивную, надо сказать. Но её можно понять: сидишь себе спокойно, растишь кровожадных ядовитых деток, а тут налетает туча сернистых облаков и портит всю малину (или что у них там на завтрак?). Естественно, надо этих владельцев заводов (газет, пароходов) покусать. А заодно погромить эти самые заводы. Что, в свою очередь, не могло понравиться нам, строителям светлого будущего. Вот я и решил сделать игровой мир ещё чуть светлее. В прямом смысле. Убрать те самые облака с тяжёлыми металлами и прочей химией и обрести, наконец, вселенскую гармонию.

Прежде всего мне хотелось, чтобы процесс улавливания и фильтрации был максимально приближен к реальности. Ведь пусть игра и происходит в некоем инопланетном сеттинге, вещества, материалы и предметы там приходится использовать вполне земные. Поэтому первым делом я пошёл бродить по промышленным сайтам и читать про методы очистки воздуха в нашем с вами вполне реальном (спорно!) мире. Как оказалось, их придумано немало, и мне пришлось сосредоточиться на основных: абсорбции (растворение в жидкости) и адсорбции (поглощение другим веществом). Для каждого я накидал небольшую схему, которая описывает техпроцесс от начала и до конца, начиная с «сырьевых» материалов и заканчивая побочными продуктами фильтрации. Так я смог понять, какие механизмы мне нужно будет реализовать и какие цепочки преобразований описать. А также определить те места, в которых игрок сможет позднее сделать улучшения.

Схема фильтрации
Одна из технологических ветвей процесса улавливания и фильтрации – абсорбционная

После этого процесс разделился на две основных ветви: собственно программирование механизмов и создание их прототипов (описание и графика). Если в части первого разработчики предоставили весьма исчерпывающую документацию (к тому же мне пригодился код из других пользовательских модов), то в плане прототипов официальный портал игры весьма немногословен. Да, он описывает всё. Но без каких бы то ни было деталей и примеров. Так что в этом вопросе я бы сразу порекомендовал смотреть на моды других игроков, благо там даже ничего декомпилировать не надо.

По кодингу сложностей у меня не возникло. Разве что пришлось немного поразбираться в игровых событиях, сохранении/загрузке и мультиплеерной совместимости. В этом плане все проблемы возникали только в тех местах, где я неправильно или не в тот момент обращался к глобальной игровой таблице. В остальном могу сказать, что авторы предоставили весьма исчерпывающий функционал, который позволяет добавлять в игру практически любые механики. Если вы не пользуетесь каким-нибудь сторонним инструментом для отладки (я находил плагины для Visual Studio Code), то game.print() станет одним из ваших любимых методов.

Bery0za's Pure It absorption workflow
Та же самая схема, но теперь уже реализованная в игре

С графикой мне предстояло решить куда больше вопросов: создание 3D моделей, конвертирование их в игровые спрайты (двумерные внутриигровые изображения, представляют собой один или несколько кадров анимации), создание описаний того, как эти спрайты должны отображаться. Могу сказать, что на это ушло процентов 80 всего времени, которое я потратил на мод. По ходу я создал предустановленню сцену для Cinema 4D, которая имитирует игровое освещение и атмосферу и позволяет сосредоточиться на создании модели, а также упрощает последующий экспорт в 2D изображения. После чего они подхватываются моей же утилитой, комбинирующей их вместе и выдающей в результате упакованные и готовые к использованию атласы.

Cinema 4D Factorio scene setup
Предустановленная сцена для трёхмерного моделирования

В моделировании мне помогли не столько видео-инструкции от зарубежных мододелов, сколько уроки по Cinema 4D, ведь каждый из них рисовал графику и организовывал экспорт по-своему. Так что я рекомендую вам сначала разобраться в деталях программы, это позволит организовать свой собственный рабочий процесс. О своём я, пожалуй, напишу отдельную статью.

Описание рецептов, самих сущностей и их графического представления – рутинная задача. Большую часть времени я просто копировал существующие описания, внося в них небольшие изменения, главное, нужно быть максимально внимательным при указании величин и ссылок. Сейчас я уже и не припомню, сколько раз во время загрузки игра показывала мне кукиш и говорила, что такая-то картинка не найдена или такой-то размер не соответствует реальности. Думаю, этот этап я тоже автоматизирую и напишу ещё одну утилиту. После чего можно будет говорить о готовом полноценном рабочем процессе, знай только придумывай механики и рисуй сущности.

Пока что для меня осталось не до конца понятным, каким образом в игре отображаются трубы и применяется окрашивание (tint), но, надеюсь, в сообществе мне помогут с этим вопросом. Кстати, если вы знакомы с английским, форум – отличное место для решения возникающих задач.

Bery0za's Pure It machines
Все механизмы с первой картинки так, как они выглядят в игре

Ух, как много получилось. А ведь это я буквально пробежал по верхам, описав в двух словах весь свой путь от идеи до рабочей альфа-версии. Понимаю, пост получился весьма техническим, такова уж природа моей деятельности. Но, возможно, кого-то он вдохновит поиграть в Factorio, а кого-то – придумать и реализовать свою собственную модификацию. Потому что для себя я усвоил главное – если ты можешь поставить себе задачу, то ты можешь и решить её. Чуть не забыл, а вот и сама ссылка для загрузки: играйте, наслаждайтесь и делайте мир лучше.

(Компьютерные) игры

С детства я люблю игры. Играть в них и создавать их. У меня было несколько старых советских книг, посвящённых игровым активностям. И они были для меня чем-то вроде Святых Граалей, из которых я вручную переписывал целые главы и перерисовывал схемы. Апофеозом моего собственного «настольного» творчества стала игра на двух ватманах А1 формата. С кучей дополнительных фишек и карточек, конечно же.

В 4 года эта книга была для меня отдельным учебником наравне с Букварём.

Затем в юности я неплохо поизвращался, создавая игры в PowerPoint. Серьёзно, приложение для презентаций можно неплохо использовать для игр в духе «Поиск предмета» или «Квест». Конечно, приходилось для каждого крупного ответвления создавать свою отдельную очерёдность слайдов, поэтому свобода действий там была сильно ограничена. Но весь прикол был именно в подаче и немного наркоманской атмосфере этих проектов. Одно только название «Миссия Режиссёра» уже интригует, не правда ли? Мы с друзьями даже целую серию запустили. Точно помню, что у нас там была ещё миссия продюсера и миссия репера (именно через «е»).

Потом у меня был долгий период, когда я забыл об этом своём увлечении, лишь изредка отмечая где-то в черновиках новые идеи относительно выдуманных миров и игровых механик. К счастью, некоторое время назад я, что называется, «вернулся к себе» и взялся за разработку компьютерных игр уже по уму. Знакомясь с программированием, с игровыми движками, с общими концепциями. Могу сказать, что сподвигли меня на этот шаг не только накопившиеся задумки, но и те игры, в которые я сам периодически играл. Во главе стоял, конечно же, Minecraft с его простейшей изначальной идеей «всё есть блок размером 1х1 м», но безграничными возможностями в рамках этой парадигмы. Я знаю, что он был далеко не первый на своём поприще, но концепция блочного, модульного, изменяемого мира получила, в нём, пожалуй, самый главный толчок, после чего пошло-поехало. Думаю, что помимо меня ещё множество людей могут назвать его вдохновителем на занятия разработкой.

Реальное программирование началось для меня с мода ComputerCraft, а не с Turbo Pascal в школе или универе.

Этим летом я столкнулся с утверждением о том, что игра как явление несёт смысл только в детстве. И оно кажется мне сомнительным. Точнее, неполным. Да, как механизм познания мира она, может быть, и полезна только в детстве. Но игра не ограничивается только этой функцией.

Как сказал один из самых известных гейм-дизайнеров Сид Мейер (вы наверняка слышали о серии Civilization, идейным вдохновителем которой он является): «Игры – это последовательность интересных решений». Конечно, это выражение вряд ли применимо к спортивным состязаниям, аркадам, да и вообще к активностям, в которых планирование и поиск стратегии не являются чем-то основополагающим. Но, в целом, мы возвращаемся в игровые миры, потому что там нам действительно интересно. Точно так же, как кто-то иногда забывает о реальности, погружаясь в кино, в книги, в театр, мы находим свои отражения, альтернативные ипостаси в играх. И в этом плане они совершенно точно являются самостоятельным видом искусства. Далеко не новым, кстати. Со своей философией и историей, своим чувственным пластом, своим посылом. Отсюда и увлечённость ими людьми любых возрастов.

Компьютерные игры – это сплав математики, технологий и всех видов искусства. Кто ещё может похвастаться такой смесью?

Я уверен, что игры обогащают нас, позволяют открывать новые грани в себе, а значит и в окружающем мире. Поэтому я желаю всем хотя бы иногда впускать их в свою жизнь. И она станет легче и насыщенней. Хотя бы на чуть-чуть.