Как сделать лидерборд в гонках

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

Если отталкиваться от методологии, которую я описал в статье Как сделать ИИ для гонок, то задача упрощается – можно использовать следующий подход, который показался мне весьма надежным и лишенным логических изъянов.

(далее…)

Обновления по итогам июня

Вышел Dagon 1.1.1. Добавлено свойство GLTFMeshPrimitive.materialIndex, индекс материала в файле glTF. Этот индекс записывается в структуру Triangle при обходе по граней с помощью GLTFAsset.opApply, что позволяет передавать данные о материалах в различные обработчики мешей. Основное применение этой фичи — учет материалов при обнаружении столкновений и рейкастинге. Соответственно, в dagon:newton добавлена поддержка индексов материалов при создании NewtonMeshShape. В интерфейсный метод NewtonRaycaster.onRayHit добавлен параметр long id, через который коллбек получает искомый индекс материала при попадании луча в меш.

Пошла серьезная работа над Chillwave Drive. Я уже рассказывал про ИИ, но, помимо этого, на днях улучшил модель колеса и наконец-то добавил поддержку материалов, чтобы машина учитывала свойства покрытия. Например, когда машина вылетает с трассы, то трава на обочине сильно ее замедляет и не дает разгоняться. Также добавил HUD-тахометр, обновил текстуры тестовой трассы, реализовал эффекты погоды — дождь и динамически появляющееся и исчезающее за облаками солнце. У игры появилась страничка на GameJolt, где я регулярно выкладываю альфа-версии.

Привел в порядок блог, объединил старую версию и новую, подкорректировал неактуальную информацию.

Как сделать ИИ для гонок

Пост является, по сути, продолжением статьи Как сделать простой автосимулятор.

Гонки — своего рода священный Грааль геймдева. Любительских гоночных игр исчезающе мало, даже простых и аркадных. А дело в том, что чисто технически «простых» гонок не существует — есть определенный минимум, которому они обязаны соответствовать, чтобы быть играбельными, и достижение этого — очень непростая задача. Если физика, как я уже отмечал в вышеупомянутой статье, не обязана быть чересчур навороченной и допускает довольно широкий разброс реалистичности, то с искусственным интеллектом особой свободы нет — виртуальные соперники обязаны изображать реальных водителей, причем, желательно, хороших. Это задача-минимум, и она же, как ни странно, задача-максимум, потому что игровому боту сильно лучше человека быть не положено.

Не будет преувеличением сказать, что ИИ — это самое сложное в играх. О графике в Интернете говорят очень много, о физике — намного меньше, а об игровом искусственном интеллекте почти не говорят. До этой территории мало кто добирается, а кто добирается — в основном, крупные студии — держат свои ноу-хау в секрете. Поэтому скажу честно: я не знаю, как написаны контроллеры оппонентов в коммерческих гоночных играх, и давно бросил попытки выяснить. Я пошел своим путем.

(далее…)

Соперники в Chillwave Drive

После релиза Dagon 1.1 я решил вернуться к демке автосимулятора Chillwave Drive — собираюсь превратить ее в полноценную гоночную игру. Этому препятствовало отсутствие ИИ для соперников, и на днях наконец-то эта задача была решена — я написал алгоритм следования траектории на базе Pure Pursiut, популярного метода из робототехники (но почему-то практически не известного в среде инди-разработчиков). В ближайшее время будет подробная статья на эту тему, а пока вы можете скачать свежий билд Chillwave Drive и увидеть ИИ в действии, либо просто посмотреть видео:

Симулятор автомобиля в Jolt

Jolt Physics включает не только готовый контроллер персонажа, но и полнофункциональный raycast vehicle — причем, это не экспериментальная поделка-бонус, как часто бывает в физдвижках, а серьезный такой префаб, который с минимальными усовершенствованиями можно брать для создания симкейда коммерческого уровня. Достаточно сказать, что он безо всякой доработки напильником уже выглядит лучше, чем, скажем, печально известная физика авто в Cyberpunk 2077. А если еще подобрать реалистичные параметры подвески и инерцию шасси, заменить встроенную модель трения шин на свою, то вообще идеально!

На видео — демка 4×4, которую я накидал буквально за день, изучив VehicleController в Jolt:

Пока в Dagon нет соответствующей объектной обертки, но это не проблема, так как можно использовать любые функции joltc напрямую. Исходники и сборку планирую выпустить одновременно с Dagon 0.42, где будет несколько важных улучшений в dagon:jolt и dagon:audio.

Как сделать простой автосимулятор

Изучение того, как устроены гоночные игры, стало для меня настоящим квестом — с 2017 года я посвятил этому немало времени. В этой статье я поделюсь своим опытом и раскрою ряд неочевидных хитростей, которые упрощают и оптимизируют физическую модель автомобиля.

Стоит сначала оговориться, что я имею в виду под автосимом. Традиционно все гонки делятся на два поджанра — аркадные гонки и автосимуляторы. В аркадных не используется реалистичная динамика, вместо нее — различные формы кинематики и визуальные эффекты, имитирующие физику автомобиля: например, видимость управляемого заноса — машина «смотрит» в одну сторону, но едет в другую, и игрок может управлять этим поведением при помощи какого-то простого механизма ввода (например, мобильный NFS: No Limits позволяет войти в дрифт свайпом по экрану в нужную сторону). Симулятор же в обязательном порядке использует настоящий физический движок — динамику твердых тел. В нем все честно: силы, моменты, ускорение, моделирование подвесок и трения в шинах. Как следствие, управлять симулируемым транспортом заметно сложнее, но мы получаем невероятное преимущество — практически все феномены, наблюдаемые на дороге в реальности, возникают как следствие модели, и их не нужно специально имитировать. Классический пример симулятора — Assetto Corsa.

Где-то в промежутке между чистой аркадой и строгой симуляцией затесались так называемые симкейды (simcade). Этим термином называют упрощенные симуляторы, где параметров меньше, и вождение не требует понимания автомобильной механики — при этом они настолько физичны, насколько это важно для сохранения реализма. Типичные примеры — франшизы Gran Turismo и Forza Motorsport, но, по моему мнению, любые «физичные» гонки, для которых необязателен руль и достаточно контроллера с аналоговыми стиками, можно считать симкейдом. В эпоху первой PlayStation мне дико нравилась TOCA World Touring Cars — хрестоматийный симкейд, причем, по тем временам, на удивление реалистичный: у машин правдоподобно деформировались любые части кузова, отваливался бампер, можно было даже потерять колесо. Создавая свой автомобильный движок, я держал в голове стиль именно таких игр. Следуя этой статье, конкурент Assetto Corsa вы, конечно, вряд ли сделаете, но, тем не менее, физика получится очень близкая к реальности — не хуже (а может быть, где-то даже лучше), чем во многих коммерческих играх.

(далее…)

Обновления

Dagon 0.35.0

Вышла новая версия движка, в которой добавлена поддержка таймеров (Application.setTimer и событие Timer) и новый модуль dagon.core.sysinfo, предоставляющий базовую информацию об аппаратно-программной платформе, на которой запущено приложение. Исправлен забагованный метод Properties.serialize, реализована поддержка текстур в формате WebP в загрузчике glTF (расширение EXT_texture_webp для текстур), добавлена поддержка Entity.blurMask в режиме прямого рендеринга. Объект NewtonMeshShape в расширении dagon:newton теперь можно создавать с передачей матрицы трансформации, которая применяется ко всем вершинам меша. Также добавлен Dagon Platform — комплект для разработки игр под Dagon на языке GScript3, о нем я расскажу подробнее в одном из следующих постов.

Chillwave Drive 0.2.0

Демка автомобильной физики значительно обновлена: улучшена графика, модель машины заменена на McLaren GT, исправлено множество мелких недочетов в симуляторе, благодаря чему демка теперь адекватно поддерживает заднеприводные авто, а также устранен баг в модели колес, который создавал лишнюю боковую силу в некоторых ситуациях. Я решил развивать Chillwave Drive в качестве полноценной игры, в связи с чем создал соответствующую страничку на сайте GameJolt. Вероятнее всего, это будет симкейд для расслабляющего вождения, в котором можно добавлять собственные машины, настраивать окружение и т.д.

Chillwave Drive

Значительно обновлена демка физики автомобиля на Dagon, которая отныне называется Chillwave Drive. Трение колес теперь моделируется на чистых силах вместо встроенных джоинтов Newton, что сделало симуляцию более точной и стабильной. При движении используется динамическое трение (продольное и поперечное) на основе формул Pacejka ’94, при остановке — статическое, препятствующее боковому скольжению машины на склоне. Улучшено управление с контроллера, также добавлена новая модель машины и шейдер неба с облаками и сменой дня и ночи.

Скачать готовую сборку демки под Windows можно тут.

Физика автомобиля: новое видео

Записал видео обновленной демки с физикой автомобиля на движке Dagon: новая модель трения (формула Пацейки), поддержка звуков (используется движок SoLoud), множество мелких улучшений и багфиксов.

Физика автомобиля

Демка с физикой автомобиля, которую я разработал в начале этого года для Patreon Sponsor Folder, теперь доступна на GitHub в репозитории https://github.com/gecko0307/vehicle-demo — с многочисленными улучшениями, которые я сделал за последние месяцы (в частности, появилась поддержка модели трения колес Pacejka Magic Formula). Пруф того, что на основе связки Dagon + Newton вполне можно написать гоночную игру. Как-нибудь, возможно, напишу подробную статью на эту тему.