PonomarevGames

PonomarevGames

«Трасса 41» — про Коляна, который купил Жигули и застрял на трассе в глубинке. Выехать нельзя — дорога закольцована. Туман, странные местные, ночью из машины лучше не соваться. Чинишь тачку, трёшь с людьми, копаешься в мутных историях. Смесь My Summer Car, Лоста и лёгкого Сайлент Хилла. Монстров нет — страх через звуки, тени и тишину. Сверху сатира на 90-е: дефицит, ГАИ, самогон, кассеты. Движок — Godot 4. Демо позже. Процесс пишу сюда. Советы и критика — заходите.
Пикабушник
Дата рождения: 5 октября
в топе авторов на 381 месте
709 рейтинг 98 подписчиков 8 подписок 4 поста 1 в горячем
2

Жигули. Физика. Боль

С персонажем разобрался — ходит, бегает, руки почти готовы. Пора за машину. Игра же не про прогулки по обочине.

Сразу скажу: встроенный VehicleBody из Godot я выкинул. Он мыльный. Машина кренится как маршрутка на повороте, переворачивается на ровном месте, подвеска живёт своей жизнью. Помучился два вечера и решил — буду делать сам.

Взял обычный RigidBody3D и написал свою физику. Колёса через RayCast3D — пускаю луч вниз, нахожу землю, считаю подвеску руками. Двигатель, коробка, тормоза — всё отдельно. Звучит как велосипед, но зато я понимаю что где крутить.

Что внутри

Машина собрана из модулей. Каждый — отдельный скрипт:

  • MyCar — корень сцены. Посадка, высадка, камера, руль мышкой.

  • MyCarPhysics — колёса на raycast-ах, подвеска, руль, тормоза, ручник.

  • MyCarEngine — двигатель. Обороты, газ, запуск с ключа.

  • MyCarTransmission — коробка. N, R, 1–4. Передаточные числа.

  • MyCarDebug — панель поверх экрана. Показывает RPM, передачу, ручник, ошибки. Штука дико полезная, без неё вообще не понять что происходит.

Дерево сцены:

Что работает

Садишься в машину — камера переключается на салон. Руль мышкой, газ W, тормоз S. Двигатель заводится на Q, слышно как обороты растут. Передачи переключаются стрелками — N, R, 1–4. Ручник на пробел. Фары, поворотники, аварийка — всё работает. Дебаг-панель пишет RPM, передачу, газ, какие колёса на земле.

Движок считает обороты:

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

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

Физика ищет землю raycast-ами и считает подвеску:

Где затык

Она не едет.

Серьёзно. Двигатель запущен, обороты растут, передача воткнута, колёса землю видят — а машина стоит. Или дёргается на месте и глохнет. Силу я прикладываю через apply_force к точке контакта колеса. Подозреваю что где-то путаю вектор направления, либо traction обрезает всё в ноль, либо точку приложения считаю не оттуда.

Дебаг-панель показывает: RPM 2500, Force 150, колёса на земле 4/4, а скорость 0.0. Два вечера ковыряю эту математику, меняю знаки, переставляю векторы — пока глухо.

Если кто писал физику машины на RigidBody3D с raycast-колёсами — подскажите. Особенно интересно: в какую сторону у вас forward (я беру -basis.z), как правильно apply_force к точке контакта, и как считать traction от силы подвески.

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

Показать полностью 5
2

«ОН ХОДИТ, БЕГАЕТ, ПРЫГАЕТ И ДАЖЕ НЕ ПРОВАЛИВАЕТСЯ ПОД ТЕКСТУРЫ»

Колян ожил. Нет, серьёзно — он теперь не просто капсула с камерой, которая скользит над землей. Он ходит. Бегает. Прыгает. Приседает. Ускоряется. У него есть анимации. И это заняло примерно неделю вечеров, два литра чая и один момент, когда я всерьёз хотел всё переписать на кубах без анимаций вообще.

Но давайте по порядку.


СТРУКТУРА ПЕРСОНАЖА (ИЛИ КАК Я РАЗНЁС ВСЁ ПО КОМПОНЕНТАМ)

Я фронтендер. Я привык, что всё — компоненты. Кнопка, форма, модалка — каждая живёт своей жизнью и не мешает соседу. Поэтому персонажа я собрал так же.

Сцена Player — это CharacterBody3D. Внутри не куча кода в одном файле, а россыпь дочерних нод-компонентов. Каждая отвечает за что-то одно:

Player — сам персонаж, CharacterBody3D. Главный узел, в нём всё.

CollisionShape3D — капсула. Радиус 0.4, высота 1.8. То, чем Колян бьётся об стены.

ModelRoot > CharacterModel — 3D-модель из ассета CasualMale. Временная, потом заменю на свою.

Head — точка на высоте 1.62. К ней привязана камера и всё, что должно быть «на глазах»:

  • Camera3D — глаза игрока.

  • InteractRay — луч для взаимодействия с предметами и дверями. Бьёт на 3.2 метра вперёд.

  • Flashlight — SpotLight3D. Тёплый свет, тени. Фонарик. Работает.

  • HoldSocket — Marker3D. Место перед камерой, где будет болтаться поднятый предмет. Когда руки доделаю.

GroundSurfaceRay — луч вниз. Понимает, на чём Колян стоит: асфальт, гравий, трава, бетон. Нужен для звуков шагов.

FootstepAudio — AudioStreamPlayer3D. Проигрывает шаги. Звук зависит от поверхности.

Components — папка с мозгами. Каждый компонент — отдельный скрипт:

  • Movement — движение. Вперёд, назад, вбок, бег, прыжок, приседание. Считает скорость, разгон, усталость. Следит за вводом с клавиатуры.

  • Camera — камера. Мышь, поворот, зум, наклон головы при ходьбе, тряска при приземлении.

  • Interaction — логика взаимодействия. Луч попал в предмет — показывает подсказку. Нажал E — подобрал, открыл дверь, дёрнул рычаг.

  • Vitals — выживание. Здоровье, голод, жажда, усталость. Каждый тикает по таймеру. Если выносливость на нуле — Movement не даёт бежать.

  • Flashlight — включение и выключение фонарика. Следит за батарейкой (потом добавится).

  • Hands — руки. Поднять предмет, бросить, осмотреть. Сейчас в разработке.

  • Footsteps — звуки шагов. Принимает сигнал от Movement, проверяет поверхность через GroundSurfaceRay, включает нужный звук.

  • Animation — анимации. BlendTree, переходы idle/walk/run/jump/crouch. Отдельная боль, описанная выше.

Зачем так дробить? Потому что когда у тебя один скрипт на 600 строк, который управляет всем — ты умрёшь его дебажить. А когда Movement отдельно, Vitals отдельно, Animation отдельно — ты открываешь нужный файл, правишь пять строк и оно работает. Ну или ломается, но ты хотя бы знаешь где копать.

Player.gd при этом — дирижёр. Он только связывает компоненты сигналами и пробрасывает вызовы:

movement.stamina_requested.connect(vitals.consume_stamina) movement.footstep_requested.connect(footsteps.play_step) movement.movement_state_changed.connect(_on_movement_state_changed) movement.landed.connect(_on_landed) vitals.exhausted_changed.connect(movement.set_exhausted)

Движение ловит ввод, камера следит за мышью, анимация дёргает скелет, виталы следят за голодом. И никто никому не мешает. Мечта.


АНИМАЦИИ. БОЛЬ. BLEND TREE

Вот тут я остановлюсь подробнее, потому что это был ад.

3D-модель персонажа — из ассета (CasualMale). Скелет есть, анимации есть: idle, walk, run, jump_start, jump_loop, crouch_idle, crouch_walk. Всё это нужно было завести так, чтобы персонаж не дёргался при переходе от ходьбы к бегу, не скользил по земле и не улетал в T-pose при резкой смене состояний.

Панель Animation в Godot. Каждая кость скелета — три дорожки вращения (X, Y, Z). Ключи на дорожках задают позу в конкретный момент времени.

Панель Animation в Godot. Каждая кость скелета — три дорожки вращения (X, Y, Z). Ключи на дорожках задают позу в конкретный момент времени.

В Godot для этого есть AnimationTree и BlendSpace2D. Работает так: у тебя есть двумерное поле, где по одной оси — скорость (от стояния до бега), по второй — направление (вперёд, вбок). Ты раскидываешь анимации по этому полю, а Godot сам их смешивает. На бумаге — красиво. На деле — я убил три вечера только на то, чтобы персонаж не дёргал ногой при переходе с idle на walk.

Главная проблема: ассетные анимации не знают про твой масштаб, твою скорость движения и твои кривые. Если персонаж скользит (ноги двигаются быстрее, чем тело) — это не баг движка, это ты неправильно настроил скорость корневой ноды. Если он резко встаёт из приседа — ты забыл transition в AnimationNodeStateMachine.

Сейчас всё работает: ходьба, бег, прыжок с фазой взлёта и приземления, приседание с отдельной idle-анимацией. Но осадочек остался. Анимации — это не код. Код ты можешь отдебажить, поставить breakpoint, понять. Анимации — это метод тыка, визуальный подбор и молитва.


ЧТО ДЕЛАЮ ПРЯМО СЕЙЧАС

Руки. Буквально. Персонаж должен уметь:

  • Открывать дверь машины (анимация руки тянется к ручке).

  • Поднимать предмет с земли (наклон, рука вниз).

  • Держать предмет перед собой (предмет крепится к HoldSocket на камере).

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

Как добью — покажу гифку. Если кто работал с AnimationLayer в Godot 4 и знает, как не сломать позвоночник персонажу при смешивании — маякните в комментах. Реально надо.


МИР — ПОКА ПРИМИТИВЫ

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


ЧТО ДАЛЬШЕ

  1. Добить анимации рук (поднятие, дверь, держание).

  2. Привязать предметы к HoldSocket.

  3. Сделать пост про мир с нормальными скринами.

Демо всё ещё впереди, но Колян уже живой. Он двигается, дышит, устаёт. Осталось научить его не быть беспомощным перед открытой дверью машины.

Подписывайтесь, если тема заходит. Вопросы, советы, проклятия — в комменты.


P.S. Да, модель персонажа пока ассетная. Свою сделаю позже, когда руки дойдут. Сначала — геймплей.

Показать полностью 3

Фронтенд на React пересел на Godot. Вот почему это больно и почему оно того стоит

Фронтенд на React пересел на Godot. Вот почему это больно и почему оно того стоит

Всем привет. Я фронтенд. JS, TS, React, Next.js — стандартный джентльменский набор. Но всегда хотел попробовать геймдев. Руки не доходили. И вот — дошли.

Встал вопрос: какой движок брать?

Unity — мощно, но тяжело и с лицензией пляски. Unreal — это ракетостроение. А Godot я скачал на пробу — и меня затянуло.

Почему Godot для бывшего фронта — зашло:

1. GDScript — как Python, только проще. Забудь про this, bind, бесконечные useCallback. Просто пишешь speed += 5 — и работает.

2. Сцены = компоненты. Делаешь машину → сохраняешь как сцену → кидаешь на карту. Знакомо по React, только визуально и без лишнего бойлерплейта.

3. Сигналы вместо EventEmitter. Всё то же самое, но встроено и не течёт.

4. Бесплатно и открыто. Не надо думать о лицензиях и «когда потребуют деньги». Качай и делай.

5. Физика из коробки. В вебе ты подключаешь библиотеку и молишься. Тут добавил CharacterBody3D — ходит. VehicleBody — машина с подвеской и колёсами. Без танцев с бубном.

Что ломало мозг:

· Нет npm install. Первое время рука тянулась к терминалу.

· Визуальный редактор вместо vim. Но привыкаешь за пару дней.

· Ось Y — высота. Первые объекты улетали в небо, потому что я тыкал y как в вебе.

Что в итоге:

За пару вечеров — работающий персонаж, машина с физикой, посадка/высадка, запуск двигателя. И кайф. Такого кайфа от кодинга у меня давно не было.

Godot — лучший вход в геймдев для веб-разработчика. Просто бери и делай. Никакой магии.

Показать полностью
697

С фронтенда в геймдев: моя мечта сделать русскую My Summer Car


Всю жизнь пилю сайты на React. Лендинги, админки, фриланс. Но с детства была одна мечта — сделать свою игру.

Не ради денег. Ради того самого чувства, когда кто-то запускает твой мир и говорит: «Ого, круто же».

Год думал. Месяц назад начал.

Делаю симулятор российской глубинки. Деревня, старая копейка в гараже, дедова тайна. Без донатных помоек, без «заплати чтобы ускорить». Просто игра, в которую сам бы играл ночами.

С фронтенда в геймдев: моя мечта сделать русскую My Summer Car

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

Не знаю, взлетит или нет. Но кайфую от процесса как никогда.

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

Показать полностью 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества