14 месяцев назад я начал разрабатывать гонку. Идея была простой - с дедлайном 4 месяца сделать простую игру без пафоса. Ну, любой разработчик знает, что произошло дальше - без пафоса не вышло.
Истоки
У меня есть глупый принцип делать как можно больше задач самостоятельно. Этот принцип применяется и к игровым движкам - я их не использую. Давным давно попробовал делать игры с нуля на языке Rust и с тех пор упорно продолжаю. Каждый год что-то новое, первым проектом был чат для VR шлемов, потом космосим... 3 космосима. И вот сейчас гонка.
Идея гонки у меня была давно, я просто люблю этот жанр и всегда знал, что в нем есть незанятая ниша. Нишей этой является некий единорог - аркадная гонка которая ощущалась бы как симулятор. Такие игры как-бы есть но они не совсем попадали в мои критерии. Мне очень хотелось, чтобы любой мог начать играть в игру без опыта, но не хотел типичный картинг или аркаду без веса автомобиля.
Было решено сделать комбат-рейсер с элементами ремонта автомобилей. Чтобы сделать моего единорога - двигатель и трансмиссия должны были симулироватся относительно реалистично(Присуствовало бы сцепление, переключение передач, кривая момента у двигателя), а покрышки относительно аркадно.
В основе "ядра" гонки встал как раз таки заброшенный космосим, от него перешел простой рендер на API Vulkan и редактор уровней, а так же система ввода, звука, и общая организация проекта.
Редактор уровней в космосиме
Через пару дней удаления всего связанного с космосом у меня получилось чистое "ядро" из которого можно было начинать лепить гонку
"Чистое" ядро без космоса
А через неделю, когда я только-только вник в основы симуляции покрышек, у меня уже ездила машинка по сцене
Кто бы мог подумать, что симуляция шин будет сложной? Ведь цель-то - сделать просто! Было решено использовать модель динамики шин Ханса Б. Пасейки. Эту модель использует большая часть гонок, кроме совсем серьезных симуляторов. Итог - первые месяцы разработки игры ушли в тонкую настройку шин. Оказалось, что внедрять эту модель в игру задача не простая. Есть множество различных способов интерпретации параметров этой модели, и каждый будет работать по разному. Особой сложностью обладает задача совмещения сил по двум осям - в оригинале модель работает только в одном направлении, а в игре шины подвергаются различным силам с разных сторон. Разные игры решают эту задачу по разному, я могу похвастатся, что метод который я использую относительно уникален - правда получен он скорее методом проб и ошибок а не наукой.
Пример ранней симуляции шин. Заметно что машина тяжело поворачивается. Финальная версия значительно отличается
Графика. Формирование внешнего вида игры
1/3
Ранние вариации графики и эксперементы с шейдерами
Графика игры развивалась по мере развития моих собственных способностей. В начале тематика игры крутилась вокруг пустынь и чего-то постапокалиптического, вроде серий игр motorstorm, но в конце органически пустыни поменялись на леса и избушки.
1/3
Первая машина оставшаяся в финальной версии игры. Узнаёте чем она была вдохновлена?
Внешний вид игры на данный момент
Развитие игры. Сложность создания игровых механик
Изначально игра планировалась только для сетевой игры с друзьями. Но по мере разработки увеличивался и масштаб, появилось желание добавить одиночную компанию. Вместе с одиночной компанией родилась и основания тематика игры - ремонт автомобилей. Вместе с ремонтом появилась и экономика, игроку нужно зарабатывать деньги с гонок, чтобы себе его позволить. Элементы комбат-рейсинга были забыты. На бумаге все просто, на практике продумывать как и что будет делать игрок оказалось тяжелой задачей.
1/2
Развитие карты города
В момент разработки я играл в Neon White, и мне очень понравилось оформление главного меню игры ввиде карты города с локациями которые можно посетить. Клянусь, я не копировал Gran Turismo! Быстро появилась идея с гаражем, где игрок бы чинил свой автомобиль, магазином автозапчастей, дилером, и свалкой старых автомобилей(Которая сейчас лишь в планах). В первом прототипе можно заметить, что вместо дилера стоит парк, в нем игроку планировалось встречать квестовых персонажей - увы, тоже идея которая не дожила до текущей версии игры.
Планировалось, что каждая гонка будет случайной. Со случайной картой и соперниками, сложность которых возрастала бы со временем. В итоге было решено отказатся от такой системы, и вместо этого иметь режим карьеры, состоящий из предустановленных мероприятий, которые игроку постепенно предстоит пройти.
Позже в игре появились и первые диалоги с персонажами. В будущем планируется развить взаимодействие с ними, но и сейчас им можно задать вопросы, вызвать на дуэль или одолжить их автомобиль
Сетевая игра
Я уже упоминал, что игра планировалась только для игры с друзьями. Эту идею я не оставил, и как только одиночная игра стала меня устраивать - я начал разработку игры по сети.
Лобби в сетевой игре
Я решил оставить элементы карьеры и в ней. При игре по сети игрок так же зарабатывает деньги как и в одиночной игре, а запчасти автомобиля имеют такой же износ. Теоретически одиночная игра является опциональной.
Первые версии сетевой игры работали уже через неделю после начала её разработки, но мелочи приходится исправлять до сих пор.
При выпуске игры в Steam так же пришлось добавить поддержку Steam Networking Sockets, для простых людей - возможность пригласить друга в игру через клиент Steam без необходимости открывать порты. Хочу отметить мой исключительно позитивный опыт с Steam SDK, разработчикам планирующим добавить сетевую игру в свои игры могу смело сказать, что боятся его не нужно.
API Vulkan - не для слабых. Я понял, что я слаб
Главной ошибкой для меня стало использование API Vulkan. Я уже упомянал ранее что в основу ядра гонки лег мой прошлый проект. Этот проект во многом я начинал ради изучения Vulkan, по этому и в гонке большую часть времени оставался он. Но лично у меня сложился негативный опыт. Во первых разработка любой фичи связанной с графикой занимала в 10 раз больше времени. Физически больше нужно писать кода, куда больше пространства для ошибок. Во вторых я постоянно натыкался на проблемы возникающие только на определенном железе. Если все работает хорошо на NVidia - далеко не факт, что код будет функционировать на картах Intel или AMD. И даже если код работает на одной видеокарте AMD - не факт, что он будет работать на другой. Это встало мне боком на первом выпуске демо версии игры - на некоторых системах игра просто не запускалась, даже не выдавала ошибку, а на других системах игра крашилась через 30 минут. Как это исправлять я не знал, а иметь в запасе 15 видеокарт для тестирования на каждой не практично. В итоге за 3 дня перевел всю графику на OpenGL и забыл про Vulkan как страшный сон. Хотя в будущем возможно постараюсь вернуть его опционально.
До выпуска демо-версии в Steam я выложил игру на itch.io. Игра не получила широкой огласки, и на момент написания статьи имеет 370 загрузок. Но польза определенно была - решение перевести игру на OpenGL было принято как раз после выпуска на itch.
График просмотров и загрузок на itch.io Заметно что в первую неделю было больше всего трафика, релиз демо версии в Steam 5го февраля никак не повлиял на количество загрузок
Выпуск демо-версии в Steam
Для выпуска демо-версии в Steam нужна была страница. Для начала нужно заплатить пошлину в 100$, это даст возможность получить доступ к личному кабинету разработчика где можно начать оформление страницы.
Поначалу я очень боялся заниматся оформлением, казалось, что это задача, к которой стоит подходить с наивысшей ответственностью. В реальности же я бы не рекомендовал разработчикам сильно нервничать по поводу оформления на ранних этапах разработки, Valve фактически пропускает все у чего есть скриншоты и внятное описание, а видимость страницы в любом случае будет низкой без дальнейшего маркетинга.
Страницу в магазине я выложил в публику в тот же день как и выпустил демо версию на itch. А вот демо версию в Steam я выпустил уже через 3 месяца, когда был уверен, что игра находится в достойном для этого виде.
Запуск оказался весьма успешным, некоторые проблемы конечно всплыли - например некоторые игроки принимали экран выбора автомобиля за экран загрузки, из за чего пришлось добавить подсказку. За неделю после запуска 400 человек добавили игру в список желаемого
Добавленные подсказки на экран выбора автомобиля
Демо версия была выпущена 5го февраля. На графике можно видеть резкий рост количества человек, добавивших игру в свой список желаемого
Про Rust
Вообще я не вижу огромного смысла говорить о языке програмирования. Честно и в заголовке он больше для того чтобы вызвать интерес. Но раз уж упомянул - скажу пару слов. Мне он просто нравится. Я пишу игры на Расте уже 10 лет и своими глазами видел развитие экосистемы. Мне нравится, что мой код работает на всех платформах без модификаций. Мне очень нравятся библиотеки и их авторы. Отдельное спасибо Ralith за библиотеку hecs(ECS система), SamiP за fundsp(Звук, высокий уровень), а так же спасибо всем, кто участвует в разработке библиотек gilrs(Ввод), cpal(Звук, низкий ровень), разработчикам nalgebra и parry(Математика и коллизия), и многим другим(Полный список используемых библиотек можно узнать скачав игру и посмотрев файл THIRDPARTY_LICENSES)
В Пикабонусе появились новые участники: Перекрёсток, Ситилинк, Детский мир, Яндекс 360, Sunlight, Островок, Flor2u и другие.
И самое приятное - у каждого бренда есть промокоды для всех, в том числе для постоянных клиентов. Без “ой, а вам не подходит”. При этом для новых - тоже варианты есть.
Пикабонус просто собирает это в одном месте: выбрал - применил - сэкономил.
Рад видеть, как активно развивается экосистема Linux. Я с нетерпением жду возможности протестировать свежую версию, для меня это часть повседневной работы.
Меня особенно привлекают два момента:
⚙️ Производительность десктопа и накопителей
Обещают значительное повышение отзывчивости под нагрузкой и оптимизацию работы с дисками. Для меня это критически важно, потому что моя зона ответственности — подготовка операционных систем, приложений и декларативное описание состояний
не только для серверов, но и для тысяч десктопных машин. Любое улучшение планировщика или подсистемы ввода-вывода напрямую влияет на пользовательский опыт и стабильность всей инфраструктуры. Чем меньше тормозов - тем меньше обращений в поддержку 😉
🦀 Rust официально в ядре
Новость о том, что Rust вышел из экспериментальной стадии и стал полноправным языком разработки ядра, не может оставить равнодушным. Это шаг к более безопасному и современному системному программированию. Появление второго официального языка - серьёзный шаг для такого консервативного проекта.
Думаю следующий язык, который я буду осваивать будет Rust. Пора расширять инструментарий и заглядывать в будущее инфраструктурных решений.
Вы будете тестировать новую версию ядра сразу или будете ждать, пока оно не войдёт в стабильный релиз или LTS-ветку?
Наткнулся на шикарное приложение, в котором можно изучать сразу пять языков программирования в одном месте. Если хотите стать уверенным профи в Python, Rust, Swift, Kotlin или JavaScript — очень рекомендую. Заодно подтянете сопутствующие технологии, фреймворки и библиотеки.
1/3
Что крутого внутри:
Собраны абсолютно все важнейшие концепции, правила, стили программирования и нужные инструменты.
Целых пять языков на борту — отличный шанс протестировать разный стек, выбрать свое направление и найти работу мечты.
Внутри лежат курсы по Git, Docker, базам данных и алгоритмам. Это база, которая делает из вас настоящего инженера с крепким фундаментом, а не кодера-однодневку.
Весь материал грамотно разбит по уровням сложности. После каждой главы идут контрольные вопросы и десятки практических задач. Авторы разбирают концепции на конкретных примерах и разжевывают всё буквально до последней строчки кода.
Доступно на Windows, macOS, iOS и Android. Учиться можно в дороге, на обеде или даже в отпуске, не прерывая прогресс.
Забрать инструмент и начать путь к званию гуру кодинга можно по этой ссылке. Пользуйтесь!
Короче, ситуация: Go хвалят за простоту, но за неё же и ненавидят. Rust — сложный, но даёт абсолютный контроль.
🚩 3 причины, почему Rust уделывает Go:
1. Память без GC. В Go есть сборщик мусора. В Rust его нет. Кратно меньше жрёт RAM, предсказуемая скорость — никаких «фризов». Хочешь под 200 микросекунд уложиться? Только Rust.
2. Типы — огонь. Option и Result заставляют обрабатывать ошибки на этапе компиляции. В Go ты тупо забываешь проверить err != nil и ловишь панику на проде. В Rust — «скомпилировалось? Значит работает».
3. Никакой магии. Go прячет рантайм и планировщик горутин. Ты не шаришь, что там под капотом. Rust даёт тебе zero-cost абстракции — код выглядит высокоуровнево, а выполняется на уровне чистого C++.
👉 Go — для быстрого старта и простых API.
👉 Rust — когда нужна максимальная производительность, надёжность и тебя не бесит компилятор (спойлер: он тебя любит и страхует).
Хочешь въехать в Rust без боли?
У меня есть канал, где разжёвываю с нуля: Rust & Beyond на ю1тубе
Там и уроки, и как я на Solana копаюсь, и даже сравниваю Rust с PHP/Go. Заходи, будет больно, но интересно! 🚀
Наше поселение разрасталось. Мы укрепили стены, установили системы оповещения и даже создали небольшой склад с запасами на случай осады. Но спокойствие было обманчивым — остров хранил ещё множество секретов. Система оповещения сработала неожиданно. На радарах появились множественные отметки — целая группа игроков двигалась в нашу сторону. Мы заняли оборону, приготовив всё имеющееся оружие. Но вместо атаки они подняли белый флаг и попросили убежища. Оказалось, что это была группа учёных, пытавшихся сбежать от экспериментов Cobalt. Они рассказали о новом проекте — создании искусственных существ, способных контролировать радиацию. Эти существа уже начали появляться в разных частях острова. Мы приняли учёных в поселение. Их знания оказались бесценными — они помогли улучшить наши технологии, научили создавать более эффективное оружие и защитные системы. Вместе мы начали исследовать природу новых существ. Радиационные зоны стали нашим новым полигоном для исследований. Мы обнаружили, что некоторые растения мутировали и теперь могли очищать территорию от радиации. Это открытие позволило расширить безопасную зону вокруг поселения. Но Cobalt не собирались сдаваться. Они запустили новую программу — дроны-наблюдатели, способные отслеживать каждое наше движение. Пришлось разработать систему маскировки и контрмер. Мы научились глушить их сигналы и даже перехватывать управление. В процессе исследований мы нашли подземный комплекс, о котором никто не подозревал. Там хранились данные о предыдущих попытках выживания на острове. Оказалось, что мы были далеко не первыми, кто пытался здесь обосноваться. Постепенно мы начали понимать истинную цель проекта Cobalt — создание идеального выжившего. Но теперь у нас был план. Мы решили не просто выживать — мы собирались изменить правила игры. Используя знания учёных и собственные разработки, мы создали систему защиты, способную противостоять атакам Cobalt. Наше поселение превратилось в крепость, а мы — в настоящую команду, готовую противостоять любым вызовам. Но самое главное — мы поняли, что сила не в технологиях или оружии. Сила в единстве, доверии и готовности помогать друг другу. И пока мы держимся вместе, никакие эксперименты Cobalt не смогут нас сломить. А остров всё ещё хранил свои тайны. И мы были готовы к новым открытиям, зная, что вместе сможем преодолеть любые трудности.
Первый день на острове Я открыл глаза на холодном берегу. Вокруг простирался мрачный, заброшенный остров, окутанный серой дымкой. В ушах до сих пор звучали отголоски взрыва, хотя я не помнил, что произошло. Первые часы были посвящены выживанию. Я собирал ветки, камни, искал еду. Куриные грудки стали моим спасением — они давали силы и калории. Постепенно я научился создавать простейшие инструменты и оружие. Исследование территории открыло мрачные тайны этого места. Заброшенные лаборатории, ржавые машины, странные плакаты компании Cobalt. На одном из них было написано о проекте бессмертия — теперь я понимал, почему каждый раз возрождаюсь на берегу. Первая база появилась в укромной бухте. Деревянный фундамент, стены, металлическая дверь — всё это защищало от диких животных и других игроков. Но я знал, что этого недостаточно. Дни превращались в недели. Я изучал чертежи, создавал оружие, исследовал радиационные зоны. Нашёл ящики с инструментами, научился создавать броню. Каждый раз, когда слышал гул вертолёта, бросался к укрытию — Cobalt продолжал свои эксперименты. Встреча с другими выжившими изменила всё. Некоторые становились союзниками, помогая строить крепость. Другие — врагами, жаждущими захватить наши ресурсы. Мы создали поселение, установили ловушки вокруг территории. Тайны острова раскрывались постепенно. Древние документы, обломки космических кораблей, следы генетических экспериментов. Мы нашли подземную лабораторию, где хранились данные о проекте Нова. Но каждый раз, когда казалось, что мы близки к разгадке, Cobalt напоминал о себе. Беспорядочные обстрелы, загадочные посылки с припасами, странные события. Мы продолжали выживать, строить, исследовать, не зная, что ждёт нас завтра. И хотя остров оставался опасным местом, наполненным загадками и угрозами, мы научились жить в этом новом мире, где смерть не была концом, а лишь началом нового пути.