К карте
ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2
Побег из трюма
0
Прогресс0 / 5
СДЕЛАЙ ПЕРВЫЙ ХОД

Нажми — и увидишь, что делает команда

Жми кнопки по очереди — это три настоящие команды.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Godot — бесплатный, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
первый код на GDScript · гравитация и delta · бег и прыжок
ШАГ 1 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2

Первый код в жизни героя

ЧТО ПРОИСХОДИТ
ЭПИЗОД 2Трюм «Дублона»

Тео бросает на верстак фонарь: «Твой герой заперт в трюме. Вода прибывает. Он умеет стоять — и это всё, что он умеет».

В трюме темно, доски скользкие, до люка десять шагов. Стоять — значит утонуть.

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

мастер Тео · кузнец Острова Кузни
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Вот что заработает к концу квеста: герой бежит и прыгает по ящикам. Всё это — пятнадцать строк кода. В ролике есть ещё прибывающая вода, лестница и люк — это Задание Гильдии, его ты соберёшь сам.

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

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ ДВИЖКА
Герой бегает и прыгает — потому что так велит код. Пятнадцать строк, которые ты напишешь сегодня.
Мастер Тео
Читать текстом
Подмастерье, твой герой заперт в трюме, и умеет он ровно одно — стоять. Сегодня дадим ему вес, ноги и прыжок. Язык у нас GDScript, и вот что тебя удивит: он почти близнец Python — того самого, на котором пишут нейросети и сайты. Выучишь один, откроешь второй и узнаешь старого знакомого. Пятнадцать строк — и герой побежит по ящикам, а камера поедет следом.

В прошлый раз он стоял неподвижно. Сейчас научится двигаться.

МАСТЕР ТЕО · ГИЛЬДИЯ РАЗРАБОТЧИКОВ
Язык у нас GDScript. Скажу честно: он очень похож на Python — тот самый, на котором пишут нейросети и сайты. Выучишь GDScript, откроешь Python и узнаешь старого знакомого.

Выдели Player → кнопка со свитком в шапке панели «Сцена» (слева, прямо над деревом узлов, а не над Инспектором) → «Прикрепить скрипт» → путь res://scripts/player.gd → в поле «Шаблон» выбери «Пустой» → Создать. Оставишь шаблон по умолчанию — Godot сам напишет готовый скрипт движения, а мы хотим написать его своими руками.

ЧТО ПОЯВИТСЯ В ФАЙЛЕ
player.gdGDSCRIPT
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 раз в секунду
ШАГ 2 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2

Гравитация: герой падает

НАСТОЯЩИЙ ЭКРАН GODOT — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН GODOT — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 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() последней строкой.
Отмечено:0 из 5

Это настоящий экран Godot 4.7 на русском — такой же откроется у тебя. Слева панель «Сцена» с деревом узлов и «Файловая система», в центре 2D-вьюпорт с линейками, справа «Инспектор». Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Отмечай пройденное — прогресс сохранится.

ЗАДАНИЕ 2 · ГРАВИТАЦИЯ
player.gdGDSCRIPT
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 делает падение одинаковым на любом компьютере. Без него герой на мощной машине с частым обновлением экрана падал бы вдвое быстрее, чем на слабой. Один и тот же код — разная игра. Правило простое: всё, что зависит от времени, умножай на delta.
ШАГ 3 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2

Бег влево и вправо

ЗАДАНИЕ 3 · БЕГ
player.gdGDSCRIPT
@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() сам знает про время кадра. Это частая путаница.

НАЙДИ ОШИБКУ
player.gdнажми на строку, после которой не хватает кода
1extends CharacterBody2D
2
3@export var speed: float = 300.0
4@export var gravity: float = 1200.0
5
6func _physics_process(delta: float) -> void:
7 if not is_on_floor():
8 velocity.y += gravity * delta
9 var direction := Input.get_axis("ui_left", "ui_right")
10 velocity.x = direction * speed
Игра запускается, красным ничего не горит — а герой стоит как вкопанный. Здесь пропущена целая строка — нажми на ту, после которой её не хватает.

Здесь пропущена строка. Игра запускается, ничего не падает красным — а герой не двигается. Нажми на ту строку, после которой кода не хватает. Подсказка: сравни с кодом на прошлом слайде.

ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Секунда, за которую игру любят или закрывают

В студиях есть выражение game feel — «ощущение игры». Это про то, как отзывается герой на нажатие: мгновенно или с задержкой, резко тормозит или скользит.

В Super Mario прыжок высчитан до мелочей: пока держишь кнопку — летишь выше, отпустил — падаешь раньше. Игрок этого не замечает, но чувствует, что «управление приятное».

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

ШАГ 4 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2

Прыжок вверх — это минус

ЗАДАНИЕ 4 · ПРЫЖОК
player.gdGDSCRIPT
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 срабатывает один раз на нажатие, а не всё время, пока клавиша зажата.

Полный скрипт героя. Пятнадцать строк — и он живой.

Почему сила прыжка записана со знаком минус — −500, а не 500?
Так короче писать
Ось Y в Godot смотрит вниз, значит вверх — это минус
Это ошибка в коде, надо исправить на плюс
СОБЕРИ СКРИПТ
ПОРЯДОК СТРОК ВНУТРИ _PHYSICS_PROCESS
move_and_slide()
velocity.x = Input.get_axis("ui_left","ui_right") * speed
if not is_on_floor():
velocity.y = jump_force
velocity.y += gravity * delta
if is_on_floor() and Input.is_action_just_pressed("ui_accept"):

Расставь строки. Правило: move_and_slide() всегда последний.

ШАГ 5 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 2

Камера и свои клавиши

ЗАДАНИЕ 5 · ФИНАЛЬНОЕ
КАМЕРА И КЛАВИШИ — ЖМИ НА КРУЖОКнажми на кружок — покажу место
СценаПроектОтладкаРедакторСправка2D3DScriptСценаLevelSprite2DPlatformCollisionShape2DPlayerCamera2DФайловая системаres://scenes/scripts/sprites/player.gdВыборПеремещениеПоворотМасштабИнспекторTexture<пусто>Position0, 0Rotation0Scale1, 1ModulateVisible✔ВыводОтладчикАудиоАнимация— Godot Engine v4.x —
  • 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 — разные действия.
Отмечено:0 из 4

Теперь игра слушается и стрелок, и WASD — как взрослые платформеры.

МАСТЕР ТЕО · ГИЛЬДИЯ РАЗРАБОТЧИКОВ
Останови на секунду и посмотри: герой бегает, прыгает, падает, камера едет следом. Это уже игра, а не картинка. И вся разница — пятнадцать строк, которые написал ты.
Мастер Тео
Читать текстом
Посмотри честно: герой бегает, прыгает, падает, камера едет за ним. И всё это сделали пятнадцать строк кода. Ты написал первый скрипт и понял, зачем нужна delta — чтобы игра шла одинаково на слабой машине и на мощной. Дальше добавим дублоны, счёт на экране и первое условие победы.

Задание Гильдии: покрути speed и jump_force прямо в Инспекторе. Сделай героя прыгучим как блоха или тяжёлым как рыцарь в доспехах. Найди значения, при которых играть приятнее всего — это и есть работа геймдизайнера.

Поднимай флаг.

Квест пройден!

Твой первый код на GDScript работает: герой бегает, прыгает и слушается клавиш. Печать КОДЕР ГИЛЬДИИ.

Что дальше. Из воды в трюме что-то блеснуло. Ещё раз. Дублоны — целый сундук раскрылся при качке.

🏅 Забрать диплом Следующий квест: Дублоны в трюме
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим