Как мы делаем 2D-симулятор грузоперевозок: что уже готово и куда движемся к MVP

Главное меню Truck Sim 2D
Главное меню Truck Sim 2D

Мы с командой «Voltage» делаем Truck Sim 2D — двухмерный сайдскролл-симулятор грузоперевозок для Android и ПК на Godot 4.6. Идея простая: игрок выбирает машину и прицеп, забирает груз, довозит его до предприятия, получает деньги и тратит их на топливо и апгрейд техники — чтобы отправиться в следующий рейс. Но со временем мы хотим, чтобы этот цикл проходили не в одиночку, а вместе с друзьями по сети.

Сейчас доступна играбельная версия 0.2.8 под Android и Windows:

Обратная связь — в комментариях или через анонимную форму

В этой статье — что уже реализовано и как это устроено, и что мы планируем сделать до минимального MVP.

Что уже сделано

Экономика и производственная цепочка

Мир игры — это город, заправка, угольная и железная шахты и металлургический завод, связанные маршрутами. Чтобы получить сталь, нужно сначала привезти на завод уголь и руду:

Как мы делаем 2D-симулятор грузоперевозок: что уже готово и куда движемся к MVP

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

Карта маршрутов и производственных точек
Карта маршрутов и производственных точек
Гараж и улучшения техники
Гараж и улучшения техники

Физика машины, прицепа и груза

Машина построена на RigidBody2D: подвеска считается отдельно для колёс, коробка поддерживает режимы P / R / D / M, можно переключаться между задним и полным приводом. Тип покрытия (асфальт, грязь, песок, снег, лёд) влияет на сцепление и сопротивление качению.

Прицеп — отдельное физическое тело на PinJoint2D, что позволяет сцепке складываться на переломах рельефа. Сборка машины с прицепом вынесена в общий TrailerFactory, чтобы связка одинаково создавалась в поездке, на погрузке и на заправке.

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

Погрузка без лишних манёвров

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

gdscript var bay := VehicleDB.get_trailer_bay(trailer_id) if bay.is_empty(): bay = VehicleDB.get_bay(GameState.selected_truck) var bay_center := (float(bay["x_min"]) + float(bay["x_max"])) * 0.5 truck.global_position.x = loading_site.global_position.x - bay_center
Погрузка сыпучего груза
Погрузка сыпучего груза

Первая сетевая версия

Сейчас это базовый технический слой, а не готовый кооператив. Один игрок создаёт комнату в локальной сети, второй подключается по IP — если оба едут по одному маршруту, они видят машины друг друга и могут ехать конвоем.

Лобби локальной сетевой игры
Лобби локальной сетевой игры
Поездка в LAN-конвое
Поездка в LAN-конвое

Связь работает через ENet: клиент передаёт позицию, скорость и обороты, а удалённая машина интерполирует эти состояния. Столкновений между игроками пока нет, деньги, груз и сохранение — локальные, отдельные у каждого. Для комнаты можно задать пароль: сервер отправляет одноразовый запрос, а клиент считает ответ через HMAC — это задел на будущее, когда сессии смогут выходить за пределы локальной сети, а не только требование для LAN как таковой.

Главный вывод этого этапа: мы умеем стабильно показывать несколько машин на одном маршруте. Общей экономики сессии, сетевого груза и механик взаимопомощи пока нет — и это следующий шаг.

Почему Godot

Выбрали Godot за связку встроенной 2D-физики, сценной структуры и экспорта сразу на Android и ПК из одного проекта. Для нас это было принципиально: `RigidBody2D`, `PinJoint2D` и коллизии для кузова с сыпучим грузом нужны были из коробки, без стороннего физического движка и без ручной синхронизации версий под каждую платформу отдельно.

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

Инструменты и структура проекта

Проект на GDScript, в Godot: карта, гараж, поездка, погрузка и заправка — отдельные сцены с переиспользуемыми машиной, прицепом и UI.

Как мы делаем 2D-симулятор грузоперевозок: что уже готово и куда движемся к MVP

В разработке использовали Kodik — редактор, терминал и AI-диалог в одном окне. AI помогал искать дублирующуюся логику (так родился TrailerFactory), переносить элементы интерфейса из кода в `.tscn` и готовить документацию. Физику, управление и LAN-сессию при этом всегда проверяли вручную на обеих платформах — автоматика не оценивает эргономику ввода и динамику прицепа.

Роадмап до MVP

Порядок для нас принципиален: сначала сделать содержательным уже работающий цикл и превратить LAN-конвой в настоящий кооператив, и только потом расширять масштаб мира.

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

Только после этого — расширение за пределы автодорог: терминалы перегрузки, железнодорожные и водные маршруты, где в кооперативе один игрок довозит груз до станции, а другой продолжает доставку поездом или судном. Это следующий большой этап, а не часть MVP.

Вместо заключения

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

Если попробуете сборку — расскажите, понятен ли основной цикл и чувствуется ли влияние груза на результат.

4