Технологии и геймдизайн в Noita — игре с симуляцией физики каждого пикселя

Сложности создания уровней в условиях полной разрушаемости.

Noita — 2D-экшен с элементами «рогалика» от студии Nolla Games, в которой работает Арви Теикари, автор головоломки Baba is You. Отличительная черта Noita — физическая симуляция каждого пикселя игрового мира, при этом твёрдые тела, жидкости и газы ведут себя по-разному.

На конференции GDC 2019 Петри Пуро (Petri Purho), один из разработчиков игры, рассказал о том, как Noita устроена с точки зрения технологий и геймдизайна. Мы выбрали из его выступления главное.

Технологии

Авторы Noita использовали кастомный движок, поддерживающий физическую симуляцию песка, жидкостей и твёрдых тел. Петри Пуро рассказал, что первый прототип симуляции песка он написал ещё на QuickBASIC, задав пикселю соответсвующий цвет и заставляя систему проверять, куда тот должен падать с помощью оператора PSET. Если под пикселем находилось пустое пространство, то пиксель просто опускался вниз, в противных случаях система проверяла пространство слева и справа. Жидкости и газы работают по схожему принципу.

В 2008 году для конкурса Gamma 256 Пуро сделал игру Bloody Zombies, которая использует почти такой же алгоритм, что и в QBasic. Однако разработчик обнаружил, что жидкости можно сделать более реалистичными с помощью системы частиц.

С физикой твёрдых тел всё было несколько сложнее. Пуро пользовался box2d. К каждому предмету применялся алгоритм движущихся квадратов (Marching Squares). Из-за этого на объектах появлялось много вершин, которые можно сгладить при помощи алгоритма Дугласа-Пекера. После этого к предмету применяется триангуляция Делоне. Так объект делится на треугольники, внутри которых каждый пиксель имеет свои UV-координаты, а система понимает, когда его позиция меняется.

В целом симуляция работает следующим образом: в начале кадра пиксели твёрдого тела будто «вынимаются» из игрового мира. Затем происходит первый шаг симуляции песка и box2d, а после этого пиксели твёрдого тела возвращаются в игровой мир и получают обновлённые координаты. В случае, если на пути твёрдого тела есть пиксели, применяется система частиц, подобная той, что использовалась в Bloody Zombies.

Изначально симуляция, использованная в Noita, была предназначена для игры в разрешении 256х256, но в таких рамках очень тяжело сделать что-то интересное, поэтому разработчикам пришлось подумать над тем, как расширить их. Проблема же заключалась в том, что на обработку каждого пикселя на большом экране уходило слишком много ресурсов CPU.

Решением стала многопоточность. Мир Noita разделён на квадраты размером 64х64 пикселя. У каждого из них есть «грязные прямоугольники» (dirty rects), которые система должна обновлять. Это позволяет компьютеру не проверять состояние пикселей, находящихся за пределами прямоугольников, тем самым снижая нагрузку на процессор.

«Грязные прямоугольники»

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

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

Белым контуром отмечены области, которые система обсчитывает прямо сейчас, а зелёным — предельные расстояния для пикселей​
Белым контуром отмечены области, которые система обсчитывает прямо сейчас, а зелёным — предельные расстояния для пикселей​

Геймдизайн

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

Главный вопрос, который стоял переда авторами: «Генерирует ли технология интересный геймплей?». Со своей стороны Пуро ответил бы: «Конечно!». Физическая симуляция всего и вся позволяет получить эмерджентный геймплей, однако разработчик не учёл, что она же может уничтожить всё. В таких условиях очень тяжело прорабатывать левелдизайн.

Noita создавалась методом проб и ошибок. Мы пытались приручить этого зверя, наш физический движок, чтобы максимизировать эмерджентность, но минимизировать её обратную, разрушительную сторону. Мы пытались добиться этого с помощью тестирования.

Петри Пуро, разработчик

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

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

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

Позднее авторам пришла идея сделать из Noita «роуг-лайт» с перманентной смертью персонажа. Это позволило вернуть дрель в игру, потому что сам жанр предполагает элемент случайности и игрок не может построить всю свою стратегию на основе этого инструмента — в некоторых прохождениях он его попросту не найдёт.

Разработчики не пришли к «роуг-лайт» сразу лишь по одной причине — в условиях, когда мир не статичен, а смерть перманента, игрок может испытывать раздражение, если персонаж умрёт не по его вине, а из-за разрушения уровня или багов, неизбежных для столь сложной системы. Чтобы не допустить этого, авторам пришлось пойти на некоторые компромиссы. Например, твёрдые тела при падении не ранят главного героя, но наносят урон противникам.

Кроме того, авторам нужно было «общаться» с игроком, передавать ему информацию. Если на главного героя вдруг польётся лава и он умрёт, то пользователь будет зол, ведь смерть наступила не по его вине. Однако если подвесить сверху, например, дощечку, которая загорится, когда её коснётся лава, игрок получит сигнал об опасности и винить в смерти протагониста он будет только себя. Пуро считает, что такого рода коммуникации очень важны в эмерджентных системах, подобных Noita.

Технологии и геймдизайн в Noita — игре с симуляцией физики каждого пикселя
179179
117 комментариев

Комментарий недоступен

22

Как уже писали ранее, лучше хороший пиксель арт, чем говеный 3D

106

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

эмерджентныйэмерджентностьэмерджентных

12

Есть адекватный аналог на русском?

1

Купил её на релизе, ни о чем не жалею))

9