Нажми — и увидишь, что делает команда
- ⏱ Сколько займёт
- 30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Godot — бесплатный, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- первый код на GDScript · гравитация и delta · бег и прыжок
Первый код в жизни героя
Тео бросает на верстак фонарь: «Твой герой заперт в трюме. Вода прибывает. Он умеет стоять — и это всё, что он умеет».
В трюме темно, доски скользкие, до люка десять шагов. Стоять — значит утонуть.
«Дай ему вес, чтобы он падал как живой. Дай ноги, чтобы бежал. И научи прыгать — иначе не выберется».
Это записано в самом Godot — движок посчитал физику и нарисовал каждый кадр. К концу квеста такая же игра будет запускаться у тебя.
Читать текстом
В прошлый раз он стоял неподвижно. Сейчас научится двигаться.
Выдели Player → кнопка со свитком в шапке панели «Сцена» (слева, прямо над деревом узлов, а не над Инспектором) → «Прикрепить скрипт» → путь res://scripts/player.gd → в поле «Шаблон» выбери «Пустой» → Создать. Оставишь шаблон по умолчанию — Godot сам напишет готовый скрипт движения, а мы хотим написать его своими руками.
extends CharacterBody2D # Решётка — это комментарий: заметка для людей, компьютер её не читает. func _ready() -> void: pass # один раз, когда герой появился в игре func _process(delta: float) -> void: pass # каждый кадр; сколько их в секунду — зависит от компьютера func _physics_process(delta: float) -> void: pass # ровно 60 раз в секунду — здесь живёт вся физика
extends — «этот скрипт управляет телом персонажа». func — коробка с командами. pass — «пока ничего не делать». Godot сам вызывает эти три функции, звать их не надо.Это скелет скрипта героя. С шаблоном «Пустой» Godot напишет в файле только первую строку — extends CharacterBody2D, а три функции набери сам: начни печатать func _ready, и редактор допишет остальное. Если шаблон был другой и в файле уже полно чужого кода — сотри всё и начни с этой строки.
_ready() — там всё начинается_process() — он вызывается каждый кадр_physics_process() — ровно 60 раз в секундуГравитация: герой падает

- 1Player и его дети — гнездо герояSprite2D — картинка, CollisionShape2D — невидимая форма, которой герой упирается в пол: в Инспекторе Shape → New CapsuleShape2D, капсула не цепляется за углы платформ. Camera2D — тоже ребёнок, поэтому едет вместе с героем. Форму растягивай за оранжевые точки, а не масштабом: масштаб растянет и картинку.
- 2Свиток над деревом — «Прикрепить скрипт»Выдели Player и жми свиток: путь res://scripts/player.gd → «Создать». Godot сам напишет заготовку с extends CharacterBody2D. Осторожно: на кадре скрипт у Player уже есть, поэтому свиток нарисован с красным крестиком — это «Отсоединить скрипт», её не трогай. Пока скрипта нет, на свитке зелёный плюс.
- 3Вкладка «Скрипт» — окно кодаПереключает редактор с уровня на текст программы, обратно — вкладка «2D» слева. Тот же файл открывает двойной клик по значку свитка справа от строки Player в дереве. Весь код этого квеста живёт внутри _physics_process: она вызывается ровно 60 раз в секунду, и физике нужен именно такой ровный шаг.
- 4Speed и Jump Force — это твои @exportНаписал в коде @export var speed: float = 300.0 — и вот здесь появилась крутилка. На кадре стоят 220 и −400, у тебя будут свои числа. Jump Force со знаком минус, потому что ось Y смотрит вниз: вверх — это минус. Крути и лови приятное управление, только записывай удачные числа: после остановки игры они не сохранятся.
- 5Треугольник — запуск, F5Проверяй по шагам, а не всё сразу: сначала герой просто падает на платформу, потом бежит от стрелок, потом прыгает по пробелу. Проваливается сквозь платформу — у неё нет CollisionShape2D. Стоит как вкопанный, а красным ничего не горит — забыл move_and_slide() последней строкой.
Это настоящий экран Godot 4.7 на русском — такой же откроется у тебя. Слева панель «Сцена» с деревом узлов и «Файловая система», в центре 2D-вьюпорт с линейками, справа «Инспектор». Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Отмечай пройденное — прогресс сохранится.
extends CharacterBody2D @export var gravity: float = 1200.0 # сила, тянущая вниз func _physics_process(delta: float) -> void: if not is_on_floor(): velocity.y += gravity * delta move_and_slide()
@export var — переменная с крутилкой прямо в Инспекторе: меняешь гравитацию, не открывая код. velocity — встроенная скорость тела. delta — время одного кадра. move_and_slide() — «шагни, учитывая столкновения».Жми F5. В самый первый раз Godot спросит, какая сцена главная — жми «Выбрать текущую» (не «Отмена»). Герой упадёт и встанет на платформу. Это первая настоящая физика в твоей игре.
delta делает падение одинаковым на любом компьютере. Без него герой на мощной машине с частым обновлением экрана падал бы вдвое быстрее, чем на слабой. Один и тот же код — разная игра. Правило простое: всё, что зависит от времени, умножай на delta.Бег влево и вправо
@export var speed: float = 300.0 # ...внутри _physics_process, перед move_and_slide(): var direction := Input.get_axis("ui_left", "ui_right") velocity.x = direction * speed
get_axis сравнивает две клавиши и выдаёт −1 (влево), 0 (стоим) или 1 (вправо). Одна строка вместо трёх.Важно: velocity.x на delta умножать не надо — move_and_slide() сам знает про время кадра. Это частая путаница.
Здесь пропущена строка. Игра запускается, ничего не падает красным — а герой не двигается. Нажми на ту строку, после которой кода не хватает. Подсказка: сравни с кодом на прошлом слайде.

Секунда, за которую игру любят или закрывают
В студиях есть выражение game feel — «ощущение игры». Это про то, как отзывается герой на нажатие: мгновенно или с задержкой, резко тормозит или скользит.
В Super Mario прыжок высчитан до мелочей: пока держишь кнопку — летишь выше, отпустил — падаешь раньше. Игрок этого не замечает, но чувствует, что «управление приятное».
Твои три числа — скорость, сила прыжка и гравитация — это ровно те же ручки, которые крутят в больших студиях неделями.
Прыжок вверх — это минус
extends CharacterBody2D # Скрипт героя: гравитация + бег + прыжок @export var speed: float = 300.0 @export var jump_force: float = -500.0 # минус = вверх! @export var gravity: float = 1200.0 func _physics_process(delta: float) -> void: if not is_on_floor(): velocity.y += gravity * delta var direction := Input.get_axis("ui_left", "ui_right") velocity.x = direction * speed if is_on_floor() and Input.is_action_just_pressed("ui_accept"): velocity.y = jump_force move_and_slide()
is_on_floor() — «стою ли я на твёрдом?». Без неё герой прыгал бы прямо в воздухе, бесконечно. is_action_just_pressed срабатывает один раз на нажатие, а не всё время, пока клавиша зажата.Полный скрипт героя. Пятнадцать строк — и он живой.
Расставь строки. Правило: move_and_slide() всегда последний.
Камера и свои клавиши
- 1ПКМ по Player → Camera2DКамера — ребёнок героя, поэтому поедет вместе с ним. Ничего писать не нужно.
- 2Инспектор → Position Smoothing → EnabledКамера начнёт догонять героя плавно, а не дёргаться следом.
- 3Проект → Настройки проекта → «Карта действий»В русской локали вкладка может называться «Список действий» (по-английски Input Map). Впиши имя в поле сверху → «Добавить» → нажми «+» в строке действия → нажми клавишу → ОК. Так три раза:
move_left(← и A),move_right(→ и D),jump(Пробел и W). - 4Вкладка Script — поменяй имена в кодеВместо
"ui_left"пиши"move_left". Регистр важен: jump и Jump — разные действия.
Теперь игра слушается и стрелок, и WASD — как взрослые платформеры.
Читать текстом
Задание Гильдии: покрути speed и jump_force прямо в Инспекторе. Сделай героя прыгучим как блоха или тяжёлым как рыцарь в доспехах. Найди значения, при которых играть приятнее всего — это и есть работа геймдизайнера.
Поднимай флаг.