Обновления

Dagon 1.3.0

Выпустил новую версию движка, до этого также вышло несколько багфиков для 1.2. Метод Application.takeScreenshot теперь совершает полную отрисовку кадра, чтобы все изменения в рендере отразились на скриншоте. Добавлены методы Material.copyTo и Material.copyFrom для копирования свойств одного материала в другой. Добавлено свойство Entity.blurOnlyRotation, предназначенное для ограничения motion-векторов угловой скоростью, игнорируя изменение позиции — это важно для объектов, которые вращаются, но не меняют своего положения в экранном пространстве, таких, как колеса машины.

Улучшен префильтр яркости для эффекта glow: добавлен верхний порог яркости, а нижний теперь не срезает пиксели жестко, используя технику soft-knee для плавной градации. Разница заметна, например, при свечении неба, которое имеет неравномерную яркость. Соответственно, добавлены новые опции render.conf: glow.softKnee, glow.maxEnergy.

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

dlib 1.5.0

Вышло небольшое обновление dlib. Добавлена функция trsMatrix для создания матрицы трансформации из смещения/поворота/масштаба за один шаг, без перемножений. Появилась функция lerpAngle для линейной интерполяции углов по кратчайшей дуге, а также shortestAngleDelta для вычисления угловой дельты по кратчайшей дуге. Добавлена новая изинг-функция easeOutElastic. Функция wrapAngle теперь работает с любыми угловыми единицами при помощи опционального параметра периода (по умолчанию период равен 360, что означает градусы).

Chillwave Drive

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

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

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

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

(далее…)

Dagon 1.2.0

Выпустил новую версию Dagon. Основным поводом к этому релизу стало исправление серьезного бага, связанного с горячим подключением геймпадов (в качестве индексов для GameInputDevice использовались неправильные ID). Кроме того, игра заметно подтормаживала при вызове InputManager.getAxis из-за использования SDL_GameControllerGetAxis — эта проблема была решена использованием значений осей из событий SDL_CONTROLLERAXISMOTION. Соответственно, GameInputDevice теперь имеет поле axisValues.

Исправлена утечка памяти в методе Application.takeScreenshot.

Добавлена поддержка суперсэмплинга. Он управляется при помощи опции ss.sampleRatio в render.conf. Если выставить в нее 2, то игра будет рендериться в двухкратном разрешении.

Шейдер FXAA заменен на более качественную версию 3.11. Добавлена поддержка независимого от разрешения радиуса размытия для фильтра свечения (glow). Если в render.conf присутствует опция glow.normalizedRadius, то обычный glow.radius не используется — радиус вычисляется динамически как доля высоты экрана. Например, если выставить значение 0.005, то при 1080p радиус свечения будет 6 пикселей.

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

Вышел 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 и увидеть ИИ в действии, либо просто посмотреть видео:

Блог восстановлен!

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

Обновления

Выпустил первое крупное обновление Dagon после стабильного релиза — 1.1.0. В этой версии исправлены некоторые баги, добавлен модуль проверки столкновений в 2D и в целом несколько упрощена работа с 2D-играми. Во всех встроенных шейдерах сабрутины GLSL заменены на ветвления для лучшей совместимости со старыми видеокартами. Стартовала работа над редактором сцен для движка.

К этому релизу я приурочил выпуск переиздания моей старой игры 2048×2 — версии популярной головоломки 2048 для двух игроков. Игра портирована на Dagon, что обеспечило поддержку x86_64 и улучшило качество рендеринга шрифтов. Также я добавил переводы игры на немецкий, французский, испанский, португальский и другие языки. Графический стиль и механика не изменились.

Сборку для Windows можно скачать тут, исходники и linux-версия будут на днях.

Подробности об инциденте 3 июня

Итак, что же произошло? 3 июня 2026 года нидерландский дата-центр nLighten без предупреждения обесточил серверы в Дронтене, которые арендовала компания MIRhosting. Этот инцидент стал продолжением массовой волны отключений: ранее с этим столкнулся еще один крупный российский хостинг VDSina.

Началась эта история с преследования двух лиц, которые, по версии следствия, причастны к кибератакам и операциям по вмешательству в выборы в Дании в конце 2025 года — в частности, обеспечивая инфраструктуру для атак хакерской группы NoName057(16). Тогда в Дании перестали работать сайты политических партий, датского парламента и издания The Copenhagen Post, а также была нарушена работа системы MitID, через которую граждане получают доступ к государственным сервисам.

По информации европейских информагентств, серверы компаний MIRhosting и WorkTitans наиболее активно использовались для осуществления незаконных действий на территории ЕС. Руководство MIRhosting, впрочем, все обвинения отрицает. MIRhosting — крупный оптовый провайдер, ориентированный преимущественно на B2B. Среди его клиентов множество мелких хостингов, в том числе и тот, услугами которого я пользовался (по соображениям безопасности, не буду его пока раскрывать).

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

Блог частично восстановлен

Хорошие новости: мне удалось восстановить большую часть постов 2026 года (правда, без картинок) из локального архива и сохранившихся копий Wayback Machine. В архивах сохранилось многое, но, к сожалению, все это практически невозможно импортировать в WordPress без ручной правки. В ближайшее время я восстановлю материалы за 2025 год, а остальным буду заниматься по мере сил.

Вскоре напишу подробный пост о том, что произошло с сервером.