Log of Alprog @logofalprog Channel on Telegram

Log of Alprog

@logofalprog


Разработка игр.
Чатик: @alprogio Автор: @alprog

#gamedev #programming #code
#геймдев #программирование #код

Log of Alprog (Russian)

Лог Алпрог - это канал, где вы найдете все о разработке игр. Здесь вы сможете быть в курсе последних новостей и тенденций в мире игровой индустрии. Канал создан для тех, кто увлечен созданием собственных игр и программированием. Вас ждут интересные статьи, обучающие материалы и советы от опытных специалистов.

Присоединяйтесь к нашему чату @alprogio, чтобы обсудить все, что касается разработки игр, программирования и кодинга. Автор канала @alprog будет рад ответить на ваши вопросы и поделиться своим опытом.

Не упустите возможность стать частью сообщества #gamedev #programming #code и получить ценные знания и навыки в сфере разработки игр и программирования. Присоединяйтесь к Логу Алпрог и откройте для себя увлекательный мир геймдева и кодинга!

Log of Alprog

20 Jan, 22:35


Иронично, но изначально я считал схему Unreal одной из самых упоротых, но по итогу сам к ней пришел.

Но зато я остался верен более нативной для DX левосторонней системе координат. Как видите, microsoft-бой однажды — навсегда microsoft-бой.

Ну и, кстати, забыл упомянуть одну из самых главных киллер-фич левосторонней системы: я правша. А это значит, что когда у меня в руке мышь, левой рукой гнуть пальцы банально удобнее. Впрочем, надо бы обзавестись распечатанной на 3D-принтере гизмой осей.

Log of Alprog

20 Jan, 22:04


3. Чтобы достичь этого, я расположил X на восток, а Y на юг. Получилась довольно упоротая комбинация Right-Back-Up. По крайней мере я никогда такую не встречал. Какое-то время я пытался привыкнуть к такому расположению, но здесь ровно та же проблема, почему я ненавижу систему координат Godot или XNA: Back это положительное направление.

По моему глубокому убеждению, положительными осями должен быть Right, а не Left; Up, а не Down; и особенно, мать твою, Forward, а не Backward. Сколько бы я не смотрел код чуваков, у которых Z+ это back, там всегда какое-то упоротое двоемыслие начинается. То они направление на камеру называют Forward вместо Back, то выворачивают гизмо наизнанку, чтобы синяя палка в негативную сторону смотрела. Словом ты уже не знаешь, чего ждать и кому верить. Да и в целом во всех формулах с участием Z уродский минус появляется, о котором надо постоянно помнить. Лучше его в кодобазу вообще не впускать. Только плюс, только вперёд.

4. И тут (после мучительных качелей туда-сюда), я в итоге пришёл к анриловской схеме Forward-Right-Up. Дефолтное положение камеры становится -90°, но зато исчезает проклятый минус. Бонусом, по умолчанию все объекты становятся ориентированы forward-ом на восток, а не север. Что, типа, более привычно, так как 0° в школьной тетрадке мы рисуем вправо.

Буквально единственный недостаток, который я в этом во всём вижу, это то, что углы будут считаться по часовой стрелке, а не как на уроке математики. Но всё GUI и многие 2D игры зачастую работают с такими углами, и ни у кого жопа не отваливается. Учитывая, сколько других проблем это решает, это довольно малая жертва.

Log of Alprog

20 Jan, 22:04


Тяжёлые выборы #1: чёртовы оси

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

Типичный пример — это кодстайл. Любой дурак знает, что не важно, какой он, главное, чтобы он был один и везде. Но обычно такого выбора и нет — мы просто юзаем тот стиль, который уже есть на проекте или в движке. И совсем другое дело, когда перед тобой действительно стоит полная свобода выбора: тебя начинает метать из стороны в сторону, как сумасшедшего. Потому что это повлияет на то, как ты будешь писать код всю дорогу и это будет не данное упавшее свыше, а твоё собственное решение. Хочется сделать удобно, чтобы не жалеть потом.

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

1. Изначально я положил XYZ самым привычным для себя образом: Right-Up-Forward. Так было по умолчанию в классическом DirectX, так сделано в Unity и так сейчас у меня на работе (Clausewitz engine). Это также NDC в большинстве GAPI (кроме вулкана), так что это такой крепкий default для 3D.

Но мой движок в первую очередь предназначен для TopDown игр, а Y-up, как известно, не очень для этого подходит. Я уже делал TopDown игру в такой системе координат (Encased на Unity) и это влекло за собой некоторое количество неудобств:

Во-первых, чтобы не заниматься постоянной перестановкой y и z из Vector2 в Vector3 и обратно, боясь рано или поздно опечататься, мне пришлось завести довольно искусственный VectorXZ и использовать везде его. Он абсолютно такой же как Vector2, но с полями xz вместо xy.

Во-вторых, в такой системе координат по-честному вращение вокруг вертикальной оси должно идти по часовой стрелке. Но мы, естественно, пихали z вместо y во все тригонометрические функции и делали вид, что так и надо. У нас всё начинало вращаться против часовой стрелки, как в школьной тетрадке, но вообще это довольно грешноватенько так делать.

2. Первый логический шаг по улучшению ситуацию — это перейти на z-up, как в Blender. VectorXZ больше не нужен. Вращение по честному начинает идти против часовой стрелки. Красота!

Но я не захотел на этом останавливаться. В получившейся схеме меня бесит, что Y-координата моей тайловой карты смотрит на север, и это не совпадает с тем, как работают координаты в TextureSpace и ScreenSpace. Не знаю, как вас, а меня бесят эти бесконечные перевороты текстур по вертикали. Я хочу работать с тайловой картой по правилам GUI: прибавлять Size спрайта целиком в положительную сторону. Потому что когда нужно прибавлять Width, но отнимать Height — это чистой воды дичка.

Log of Alprog

16 Jan, 19:20


Умер король. Трое наследников поссорились и разделились на 3 страны. Они договорились, что через 3 поколения их правнуки проголосуют, объединяться ли назад в одно королевство или жить дальше отдельно.

В каждой из стран все 3 поколения была постоянная рождаемость (у каждого в стране одинаковое количество детей, бездетных нет). Все правнуки дожили до голосования. Жители двух стран были единогласно ЗА, а третьего — ПРОТИВ. И получилась НИЧЬЯ.

Злые языки шепчут, что обязательно был инцест. Докажите, что это не так.

Log of Alprog

03 Nov, 22:20


Ixxtension

Не так давно я перевёл свой Crunch House на С++ модули. Надо сказать, это та ещё попоболь, даже если проект пока ещё крошечный.

Во-первых, главные вендоры IDE в 2024 до сих пор не договорились какое должно быть расширение у интерфейса модуля. Настроить это всё дело кроссплатформенно и через CMake — это вообще не тривиальная процедура. Но, слава богу, я эту часть полностью скипнул, так как работаю только под виндой и под вижак.

Однако же, я в полной мере вкусил во-вторых: мешать модули и обычные хедеры нельзя. Если ты сделал import std в одном хедере, то будь добр делай так же во всех (в рамках одного транслейшн юнита). Заинклудил 3rd-party библиотечку, которая где-то там внедрах использует vector? Ну всё, каюк: нечитабельные ошибки тебе обеспечены.

В-третьих, почти нереально модулизировать что-то перекрытое макросами, типа directx 12 API. Оно ещё тянет всякие виндовые хедеры, ComPtr и прочие приколы, которые тоже могут с std законфликтовать. В общем, без хаков не обходится.

Я уж молчу про то, что подсветка IDE конкретно тупит и отваливается на модулях. И всяких банальных удобств нет, типа переключения между cpp и ixx файлами. Последнее меня настолько сильно бесило, что я написал VS extension для этой цели. Назвал его Ixxtension, забирайте, если вдруг таким же страдаете.

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

Log of Alprog

30 Oct, 07:27


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

Ошибка получается у него не в коде, а только в объяснениях происходящего. Думаю, он загуглил формулу без понимания, потому что на его же примере (0.5; 0.5) действительно получается полная ерунда. Объяснял он это всё тоже очень странно и путано, из-за чего я поспешил сделать вывод, что смысла там нет вообще.

Но готов признать, что в данном случае я поторопился с выводами. Код там в порядке, ошибка только в объяснениях. Что всё равно не очень хорошо для тех, кто собрался учить, но всё-таки намного меньшее зло, чем я выставил изначально.

Log of Alprog

29 Oct, 20:57


Да ёперный театр.

Опять мне попался ролик Сакутина. "Как ПРАВИЛЬНО сделать передвижение в Unity? Нормали поверхностей". Естественно не удержался и посмотрел, особенно на фоне моего прошлого поста.

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

Я не берусь комментировать, что за ахинея происходит у него в формуле; но даже на его численном примере невооружённым взглядом видно, что получается какая-то ерунда. Нормаль у него диагональная под 45° (0.5; 0.5). А вектор вдоль плоскости, который по определению должен быть перпендикулярен нормали, нифига не под 45° (-0.75; 0.25).

Вот это вот хрен победи что подаётся как ПРАВИЛЬНОЕ (капсом) передвижение в Unity.

Я уже просто не знаю. Может и правда пора огромный пост на DTF написать?

Log of Alprog

14 Oct, 20:53


Извините, но снова про Сакутина.

Щас зашла опять речь про его курсы, зашёл глянуть его «самый полный курс по юнити». Раздел математика. Они позвали Земскова рассказать про вектора. Оси в юнити он показал правильно, левой рукой. Видимо, ЯЮниоровцы додумались сказать, что там LHS. Но дальше он объясняет кросс-продукт. И несколько раз подчёркивает, что для кросс-продукта (в отличие от осей) нужно пользоваться именно правой рукой. И векторное произведение a⃗ x b⃗ у него получается вниз.

К Земскову никаких претензий нет. Он математик. Но сука. Ни у кого из этих юнитологов ничего не щёлкнуло, когда они это в курс вставляли. Какой же стыд адский.

Log of Alprog

11 Jul, 22:17


Я пишу новый движок

План-банан доделать текстовую статью по матрицам до отпуска с треском провалился: за три недели я так ни разу и не сел за неё. Как только прошёл чёткий дэдлайн с презентацией, сразу же по вечерам стало побеждать желание переключиться на что-то другое.

Переключился я не на абы что, а обратно на Crunch House. Покрутив немного свой прошлогодний код на Godot’е, повзвешивав все за и против, пришёл к закономерному выводу, что это был набросок прототипа, а чистовик надо писать на своём движке.

Да, сука. Опять.

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

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

— Во-вторых, несмотря на то, что Godot намного приятнее Unity, с ним всё-таки приходится немного бороться. У меня почти получилось сделать там хорошую мультиоконность, но ценой проклятой структуры проекта и одного скрытого окна. Также каскадные шадоумапы почувствовали себя не очень хорошо при рендере в несколько вьюпортов. Ну и конечно необходимость перепиливать систему инпут евентов под себя. В общем, моментиков хватает.

— В-третьих — и это, наверное, на самом деле самый главный аргумент — Crunch House будет игра про трушную разработку на собственных движках. Как будто бы делать такую игру не на своём движке — зашквар.

— В-четвёртых, это мой пет — чё хочу, то и делаю. Я в другом городе, как говорится.

В общем, снова пишу движок. Но в этот раз совсем другая концепция.

Моя прошлая попытка движка (Judy) концентрировалась вокруг совсем низкоуровневых вещей (и дальше не продвинулась): собственный кроссплатформенный оконный менеджер и инпут, кроссплатформенный рендер и компиляция шейдеров, IDE на Qt, встроенный текстовый редактор и дебагер скриптов.

В этот раз я прям так шизеть не буду. Формула такая: SDL2 + DX12 + ImGui + KuKu.

Всю кроссплатформенную возню с ОС я заменяю индустриальным стандартом в виде SDL2 (писать самому было интересно, но бессмысленно).

А рендер я пока вообще не буду делать кроссплатформенным. Это можно будет сделать когда-нибудь в будущем, но постфактум, а не заранее. Так что пока для простоты буду на голом DX12. Хотя слово «простота» плохо подходит для DX12. Там, на минуточку, даже мипмапы и MSAA надо руками резолвить. Благо мне не так-то много всего надо написать. Каскадные тени, блум. Особо больше ничего использовать не собираюсь. Вряд ли даже TAA буду лепить.

Возня с Гуи на Qt тоже идёт нафиг: берём индустриальный стандарт ImGui. Отлично подойдёт как для девелоперских тулзов, так и для внутриигрового Gui (под жанр симулятора оно идеально).

Фактически я даже не движок собрался писать, а сразу игру, постепенно выделяя движок в отдельную сущность (такая механика, кстати, задумана и в геймплее Crunch House, хе-хе).

Но самая мутная часть движка — это, конечно, Ku-ku. Я там давно застрял на куче архитектурных дилемм, когда хочется всего и сразу, но хотелки конфликтуют друг с другом. Надо будет в какой-то момент сесть, подумать, что мне больше всего нужно именно для Crunch House, и устроить нещадный фичекат.

Вот как-то так. А движок на этот раз называется Finik. В честь кота. Он мелкий (это же кот), но бойкий. Шугает тут шведских котов. Имя короткое, легко произносимое и, вроде бы, уникальное.

Log of Alprog

24 Jun, 16:03


Ёж восстаёт из могилы.

Ребят, я не сдох. Честно. Я даже генерил какой-то контент последнее время, но почему-то только не сюда. Давайте отчитаюсь, что и как.

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

Во-вторых, подкасты. Мы записали 4 выпуска, в том числе с Хомаком, Ториком и Апанасиком. Это была моя вторая, и, похоже, последняя попытка попробовать себя в этом жанре. Ходить гостем и отвечать на конкретные вопросы мне норм (помните, я ходил в КДИ пояснять за С++?), но вот быть ведущим — это вот прям совсем не моё. Мне нравится производить относительно сложный контент, в котором ты, по крайней мере, контролируешь каждую букву. А говорить что-то нон-стопом без подготовки — это не то, что я могу потом с чистой совестью посоветовать другим людям послушать.

Я стал крестным отцом подкаста, познакомив Никиту и Марка, а сам изначально не планировал туда влазить, но зачем-то влез под общие уговоры. Но теперь закономерно ухожу в тень, а вот ребята фигачат дальше. У них уже были Кортез и Альфина, ребята развиваются. Их можно слушать на всех платформах.

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

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

Где-то в самом начале блоге упоминалось, что тут будет что-то и про путешествия, поэтому поведаю, что в отпуск мы собрались в Средиземноморский Круиз. У меня на счету пока 23 страны. Должны добавиться 3 новые: Италия, Франция и Ватикан.

Ну а после отпуска я всё ещё планирую, наконец-то, вернуться к скриптовому языку ку-ку и симулятору геймдева Crunch House. Очень надеюсь, что в скором времени этот блог превратится в дневники разработки Crunch House и будет таким оставаться на долгие годы. Stay tuned.

Log of Alprog

11 Feb, 21:11


Как делать сайты в 2024

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

Короткий ответ: сайт надо хостить на Github Pages, генерить статику с помощью Jekyll.

Теперь напишу более развёрнуто, как я дошёл до таких мыслей. Личных сайтов у меня, как и у многих, была целая куча. Штук 6 или 7 разных итераций. Начиная от кринжовой странички AlprogCompany на народе с фоткой в разделе «обо мне»; и заканчивая блогом на PHP с самописной админкой контента. Проблемы у этих сайтов всегда одни и те же, и к ним я ещё вернусь. Но изначально я решал вообще другую проблему.

Как вы возможно знаете, я иногда пишу рассказы на всякие литературные конкурсы, и закономерно встаёт вопрос: куда их выкладывать? Требования очень простые: хотелось залить куда-то один раз в одно место и забыть на миллион лет, но чтобы оно всегда было доступно по прямой ссылке в читабельном виде. С одной стороны есть специализированные коммерческие ресурсы, типа Литрес или Автор.тудей, но они пихают рекламу и часто меняются. С другой стороны вырвиглазный Самиздат и зашкварная Проза.ру, на которых в принципе не очень приятно находиться в окружении web 1.0 и иконок одноклассников. Пилить и поддерживать своё решение ради этого тем более казалось оверкиллом.

Решение нашлось гениальное: github.com. Просто кидаем файлы в репо и всё: ваши рассказы доступны по прямой ссылке, они читабельно свёрстаны, в окружении нормального дизайна, есть список всех рассказов, да и ссылка на них явно в большей сохранности, чем большая часть интернета. А может быть ещё и во льдах арктики забекапят на случай постапокалипсиса.

В первой итерации это уже лучше, чем любое специализированное решение для хранения рассказов. Во второй итерации можно использовать возможности Markdown, чтобы навести красоту. А когда я пощупал третью итерацию, которой являются Github Pages и генератор статики Jekyll, я уже всерьёз задумался о полном переезде всех личных сайтов.

Потому что у личных мелких сайтов проблемы всегда одни и те же:
- Дизайн устаревает быстрее, чем они выбираются из под плашки «Under Construction»;
- Обновления случаются так редко, что ты порой уже и не помнишь, как там правильно добавлять контент. И какой пароль от FTP;
- Неудобно обновлять контент и управлять версиями. Либо для того, чтобы стало удобно, надо сделать ряд дополнительных приседаний. Особенно на новой машине;
- Надо думать о хостинге. Регулярно платить ему какие-то деньги, да ещё и сталкиваться с его закидонами: то он работы на серверах будет проводить, то PHP обновит до неудобной версии, то тарифы и ограничения поменяет;
- Домены имеют свойство протухать, угоняться киберсквоттерами и прочие неприятности. Из-за чего у вас потом по всей сети протухшие ссылки в старых постах. Нет ничего более жалкого, чем протухшие ссылки на личную страницу.

Всё это говорит о том, что личный сайт нужно делать как можно проще по дизайну и как можно проще для поддержки. В идеале полная статика, потому что чем меньше всего задействовано, тем меньше, чему ломаться. Кучка md-файликов, которые декорируются простым скриптом — это именно такое решение. При этом если вы девелопер, то в отличие от всяких хостингов, гитхаб у вас всегда под рукой, вы не забудете от него пароль. Сделать коммит через сайт или выкачать репо вы сможете всегда и везде за 5 минут.

Кроме того, Github Pages это уже что-то вроде стандарта индустрии для лэндинга и документации по всяким опен-сорсным библиотечкам. Почему бы не расширить это на личные сайты в принципе?

Я так запилил свой личный сайт (там можно почитать мои рассказы) и сайт нашего подкаста (там уже можно послушать новый выпуск про эмиграцию).

Log of Alprog

11 Feb, 21:11


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

Log of Alprog

29 Jan, 09:42


Сделал сайт для нашего подкаста. И там совершенно случайно уже есть новый выпуск со Святославом Ториком. Говорят, я там болтал уже побольше, чем в пилоте. И вообще там уже ближе к разработке разговор идёт: про геймдизайн и всё такое.

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

https://ducksyndrome.github.io/

Log of Alprog

14 Jan, 15:06


А у меня тут подкаст внезапно

Помните, три года назад я пытался замутить что-то типа подкаста? Тогда это ещё было в, прости господи, clubhouse. В общем, представляю вашему вниманию попытку номер два. На этот раз на более традиционных платформах, а вернее на всех основных: от Apple Podcast до Youtube. Спотифая пока нет, но тоже будет (как объяснили наши лучшие специалисты, его надо отдельно через жопу регать).

Случилось всё, как водится, спонтанно. Мой знакомый ещё по Калининграду геймдиз @web_lain, автор канала Осмысляя культуру (кстати, подписывайтесь), твитнул, что, дескать, хочет мутить подкаст. Я ему тут же сосватал в соведущие Марка — нашего сценариста с Encased. Там же, в твиттере, и по поводу первого гостя сразу порешали. Встречайте: Дмитрий Хомак, автор lurkmore и легенда рунета. Изначально я думал, что останусь крёстным отцом подкаста, но как-то слово за слово, и в общем я тоже у микрофона.

Всё это безобразие называется Синдром Утёнка. Концепция проста: зовём классных гостей из индустрии и около неё, казуально общаемся про всякое медиа и игры в частности. На этот раз никакого технического занудства. По крайней мере в первых двух выпусках обошлось без этого. А там как пойдёт.

Послушайте пилот, и обязательно отпишите, насколько кринж.

00:00:01:11 — Представляемся
00:00:54:05 — GTA: серия скатилась?
00:16:15:20 — Хомак и русский игрожур
00:28:40:04 — Как Сапковский потерялся в лесу
00:33:33:17 — Закат бумажных игровых журналов
00:35:14:03 — Нейросети отнимут твою работу
00:42:56:20 — Почему хорошая локализация — это сложно
00:48:49:14 — Нейронки, религия и Макаронный Монстр
00:55:22:22 — Как игрожур умер окончательно
01:07:18:21 — Играет ли Хомак в игры сейчас?
01:08:56:19 — Про кринжовый игровой секс и не только
01:14:59:07 — Плавно закругляемся
01:15:17:02 — Внезапная история напоследок

Ссылка на все ссылки:
https://su.mave.digital

Log of Alprog

12 Jan, 00:38


Roblox, VR и немного HL:Alyx

В декабре недельку поковырял программирование Roblox под VR. Давайте расскажу немного про впечатления.

Началось всё с того, что около года назад у меня значительно расширился состав шведских полуродственников, среди которых оказался в том числе и фанат роблокса соответствующего возраста. Чтобы впечатлить мелкого, я по дурости заявил, что вообще-то для такого крутого разраба, как я, сделать игру в роблокс — плёвое дело. Разумеется, этот комментарий был интерпретирован не иначе, как прямое обещание, и с тех пор припоминался мне при каждой встрече. Мои наивные надежды, что оно как-то само собой забудется через пару месяцев, не оправдались: рост у детей короткий, а вот память длинная. Хуже того, уже близилась рождественская посиделка, которая в этом году хостилась у меня дома, так что отвертеться как-нибудь красиво не получалось совсем. Нужно было что-то делать.
Звёзды сошлись ещё и таким образом, что в качестве новогоднего подарка самому себе я как раз купил Meta Quest 3, так что игру делать я начал не куда-нибудь, а именно под VR.

Для начала изучил, что там вообще есть в этом вашем роблоксе. Короткое исследование выявило, что в популярном правят балом всевозможные вариации на тему кликеров, которые на местном сленге гордо зовутся «жанром симулятора»; а также всякие паркур-игры (то бишь просто платформеры). Надо сказать, что Roblox Studio из коробки предоставляет весьма богатый функционал именно для таких игр (ну или чего-то GTA-подобного): тут есть персонаж со скинами, стандартный контроллер с камерой от первого и третьего лица, позволяющий прыгать и плавать (но не приседать, например), инвентарь и система переключения предметов в руках, транспорт. Наборчик на первый взгляд достаточно типичный, но самая главная фишка Роблокса, что всё это стандартное барахло изначально спроектировано для мультиплеера!

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

Вернее не совсем lua, а luau. И это не может не порадовать более искушенных в программировании людей. Luau делает с lua примерно то же самое, что typescript делает с javascript. Это суперсет, который привносит в язык аннотации типов и прочие вкусности, что делает из полной динамики что-то гораздо более юзабельное и надёжное. Вместе с местным автокомплитом ощущается довольно освежающе, и на самом деле это, пожалуй, моё лучшее впечатление от Roblox.

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

Впрочем, я и не собирался городить BG3, мне нужно было собрать демонстрационный уровень на 5 минут геймплея для рождественской пати. За основную концепцию был взят паркур в его минимально-возможном исполнении — «пол это лава»! Но до и после я разбавил это дело VR-фишками: стрельбой из пистолетов руками, а также в качестве кульминации сделал в конце прыжок веры в бассейн. Причём сделать это нужно было именно шагнув в пропасть собственными реальными ногами, потому что ходьбу стиками в этом месте я специально отключал (так в разы круче ощущается).

Log of Alprog

12 Jan, 00:38


Проблема была только в том, что стандартный контроллер ходьбы, само собой, заточен в первую очередь под мобилки и PC. Поэтому если ты играешь от первого лица в VR и шагаешь собственными ногами, то ты просто выходишь из тела персонажа.

Собственно, основная мозгоёжка была связана с переписыванием камеры и ходьбы в VR. Задача осложняется тем, что информации по нестандартным кейсам ужасно мало. На форумах сидят преимущественно тотальные нубы и решают примитивные задачи. Причём в качестве солюшена часто делятся кодом с припиской «я сам хз как это работает».

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

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

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

Ну а после праздников я смог добраться до того, ради чего брал себе Meta Quest — к Half Life Alyx. Игра, кстати, абсолютный топ. Вернула мне детский восторг от новых игровых ощущений. Да ещё и в любимой вселенной. После прохождение за 5 дней подряд по 3-4 часа в день, ещё какое-то время ловил прикольные эффекты дереализации в реальности и трёхмерные галюны перед сном. Ну и не без удовольствия заметил, что из всех схем управления, которые есть в Alyx, самая классная совпадает с той, как я делал в роблоксе.

Log of Alprog

30 Dec, 13:45


Привет.
В начале 2022 шли к закату (летели я бы сказал). Релиз игры в сентябре 2021 был не самый удачный, не супер плохо, но не хит. Все продажи забирал издатель. У владельца была возможность получить инвестиции на будущее, но он поверил что дальше будет рост как в 2020-2021 :) Решили своими силами дальше пилить. При этом начались метания, как и что делать, даже в крипту 🙄 пытались залезть.
Когда ёбнула война владелец понял что теперь точно никаких инвестиций не получить да и в принципе ёбнул кризис в геймдеве, я думаю вы заметили это в 2022-2023. Разочаровался в геймдеве и постепенно слил студию. Сначала половину штата распустили, думали что ещё дадут время на прототип или бетку чтобы выйти в РД или найти инвестиции, но по итогу в июле-августе закрыли, почти одним днём :)
В итоге проект сейчас болтается на аккануте у издателя, не знаю как они планируют возвращать его назад и кому, когда кончатся права. Там есть потуги выпустить на консоли и как то перезапустить всё это дело, но они пока не уверенные и теоретические. В свободном полёте, даже патч издатель не выпустил.
Ребята которые работали - многие разошлись по приличным заведениям типа Owlcat, Mundfish, mail.ru, Saber и в том числе иностранным конторам, как Алпрог.

Log of Alprog

30 Dec, 13:45


Что случилось с Dark Crystal Games? Делаю Forward, где Слава всё раскидал, поскольку описаны события после релиза (когда я уже ушёл). Слава, кстати, Senior геймдиз на BG3.

Log of Alprog

24 Nov, 00:30


И снова кудах-кудах.

Мой пет CrunchHouse, анонсированный в сентябре, ожидаемо встал на паузу. Но не потому, что я потерял интерес или идея сдохла. Нифига. Это по-прежнему мой основной долгострой, которым я собираюсь упарываться ещё многие годы. А потому что если уж упарываться, то делать это основательно. Как и было предсказано, руки зачесались делать его не на чём попало, а непременно на своём скриптовом языке. Так что по вечерам моя девушка всё чаще слышит от меня фразу, что мне надо немного «покуковать», то есть позаниматься ku-ku.

Напоминаю, что концепция ku-ku сформулирована как «typed lua meets intelligent json». Простой язык, как lua, заточенный под лёгкий модинг, но с типами и с 1st-class citizen сериализатором. Причём таким, что сериализует сразу в байткод виртуальной машины. А десериализация, соответственно, тупо сводится к исполнению этого кода. Такой подход позволит в теории писать всякие конфиги и префабы на сабсете языка, и всё это будет подсвечиваться, автокомплититься и рефакториться в IDE ровно так же, как и сам код (для этих целей у меня с самого начала разработки используется Language Server Protocol). Ну и сейвы со сценами заодно тем же механизмом будут сериализоваться.

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

На повестке дня сейчас вызов функций. Затем Debug Adapter Protocol, чтобы можно было подебажить выполнение скрипта в VS Code (ну или Emacs и Neovim). Это всё проблем вызывать не должно. Но затем надо будет вернуться к семантическому анализу и линковке. Это пока наиболее проблемная часть для меня. Так что смотрю в будущее с немного обосранными от ужаса глаза, но всё-таки делаю потихоньку.