К карте
ОСТРОВ КУЗНИ · GODOT · КВЕСТ 4
Крабы на палубе
0
Прогресс0 / 5
СДЕЛАЙ ПЕРВЫЙ ХОД

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

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

Из уровня можно вылететь

ЧТО ПРОИСХОДИТ
ЭПИЗОД 4Палуба «Дублона»

Люк открылся, но на палубе не легче: крабы. Панцирные, злые, ходят туда-сюда по своим тропам.

«Они не думают, — говорит Клык. — Они ходят по кругу. Кто не заметил тропу — тот покормил краба».

Пройти мимо можно. Нужно только выучить их маршрут — и уйти на нижнюю палубу, пока они на другом конце.

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

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

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

До сих пор в твоём платформере нельзя было ошибиться. Сегодня это меняется.

МАСТЕР ТЕО · ГИЛЬДИЯ РАЗРАБОТЧИКОВ
Клык поглядел на твой уровень и хмыкнул: «Красиво, но скучно — ходишь и собираешь». И ведь прав. Игра становится игрой в тот момент, когда появляется риск.

Сегодня добавим три вещи: шипы, которые перезапускают уровень, врага с маршрутом патруля и портал на второй уровень. Три Area2D — и уровень оживает.

ЗАДАНИЕ 1 · ШИПЫ
scripts/spike.gdGDSCRIPT
extends Area2D

func _on_body_entered(body: Node2D) -> void:
	if body.name == "Player":
		get_tree().reload_current_scene()  # уровень начинается заново
Проверка if body.name == "Player" обязательна: без неё уровень будет перезапускаться от касания монеты, врага и вообще чего угодно. get_tree() — «дай мне всё дерево игры».

Повесь этот скрипт на шипы — и обязательно подключи сигнал body_entered: выдели шипы → вкладка «Узел» (рядом с Инспектором) → двойной клик по body_entered → «Подключить», как у монеты в третьем квесте. Без этого функция не вызовется ни разу.

Форму столкновения делай чуть меньше картинки — иначе игрок будет умирать, пролетая рядом, и злиться.

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

Враг, который ходит сам

ЗАДАНИЕ 2 · ПАТРУЛЬ
scripts/enemy.gdGDSCRIPT
extends CharacterBody2D

@export var min_x: float = 0.0    # левая граница патруля
@export var max_x: float = 0.0    # правая граница патруля
@export var speed: float = 50.0   # скорость врага

var direction: String = "left"

func _physics_process(delta: float) -> void:
	if direction == "left":
		velocity.x = -speed
		if position.x <= min_x:
			direction = "right"
	else:
		velocity.x = speed
		if position.x >= max_x:
			direction = "left"
	move_and_slide()
Это конечный автомат — самая простая форма ИИ в играх. У врага два состояния, «влево» и «вправо», и правило перехода между ними. На той же идее устроены боты в больших играх, только состояний там сотни.

Границы min_x и max_x выставь прямо в Инспекторе: посмотри координату X врага в крайних точках маршрута и впиши.

Что произойдёт, если оставить min_x и max_x равными нулю?
Враг будет стоять на месте
Враг доползёт до левого края и застрянет там, подрагивая
Godot покажет ошибку
ЗОНА ПОРАЖЕНИЯ ВРАГА
Самому врагу шипы не нужны — добавь ему ребёнка HitZone типа Area2D и повесь на него тот же spike.gd — не забыв подключить сигнал body_entered и у этой зоны тоже: сигналы подключаются каждому узлу отдельно. Один скрипт работает и на шипах, и на враге. Это нормальная практика: хороший код пишут один раз и вешают на десять объектов.
ШАГ 3 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 4

Портал на второй уровень

ЗАДАНИЕ 3 · ПОРТАЛ
scripts/portal.gdGDSCRIPT
extends Area2D

@export_file("*.tscn") var level_path: String = "res://scenes/level_2.tscn"

func _on_body_entered(body: Node2D) -> void:
	if body.name == "Player":
		get_tree().change_scene_to_file(level_path)
@export_file даёт в Инспекторе кнопку выбора файла — не придётся вручную писать путь и ошибаться в букве. change_scene_to_file закрывает текущий уровень и открывает новый.

Скрипт вешается на портал-Area2D — и снова подключи сигнал body_entered во вкладке «Узел».

Второй уровень делается копией первого: Сцена → Сохранить сцену как… → путь res://scenes/level_2.tscn (папка scenes у тебя уже есть с первого квеста). Переставь в копии платформы — вот и второй уровень.

НАЙДИ ОШИБКУ
scripts/spike.gdнажми на строку с ошибкой
1extends Area2D
2
3func _on_body_entered(body: Node2D) -> void:
4 get_tree().reload_current_scene()
Уровень перезапускается сам собой, даже когда игрок стоит на месте.

Этот скрипт работает неправильно. Уровень перезапускается сам собой, даже когда игрок стоит на месте. Нажми на строку, в которой беда.

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

Враг, который ничего не соображает

Первые враги в играх не думали вообще: ходили по кругу и разворачивались у стены. В Super Mario гриб именно такой — и это любимый враг миллионов.

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

Поэтому в хороших играх сложные враги появляются позже, а первый всегда предсказуем.

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

Разгон вместо рывка

ЗАДАНИЕ 4 · УПРАВЛЕНИЕ
scripts/player.gdGDSCRIPT
@export var speed: float = 200.0   # максимальная скорость
@export var accel: float = 1000.0  # разгон (новая переменная)

func _physics_process(delta: float) -> void:
	if not is_on_floor():
		velocity.y += gravity * delta

	var x_input := Input.get_axis("ui_left", "ui_right")

	if x_input != 0.0:                                    # ← новое
		velocity.x += x_input * accel * delta            # ← новое
		velocity.x = clamp(velocity.x, -speed, speed)   # ← новое
	else:                                              # ← новое
		velocity.x = move_toward(velocity.x, 0, accel * delta)

	if is_on_floor() and Input.is_action_just_pressed("ui_accept"):
		velocity.y = jump_force

	move_and_slide()
Меняются только четыре строки про velocity.x — гравитация, прыжок и move_and_slide() из второго квеста остаются на своих местах. Сотрёшь их — герой перестанет падать и прыгать. clamp не даёт скорости вырасти выше максимума, move_toward плавно гасит её, когда клавишу отпустили.

Здесь вся функция целиком — сверь со своей и замени только середину. Разница чувствуется сразу: игра перестаёт быть «дёрганой». Именно эти строки отличают приятное управление от деревянного.

Ты поставил accel = 100 вместо 1000. Что почувствует игрок?
Герой станет разгоняться очень медленно, будто идёт по льду
Герой станет быстрее
Ничего не изменится
ШАГ 5 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 4

Собери опасный уровень

НАСТОЯЩИЙ ЭКРАН GODOT — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН GODOT — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1Дерево — сюда встанут шипы, краб и порталПКМ по Level → Area2D: так рождаются и шипы, и портал — сквозь них проходят, а они это замечают. Краб другой: CharacterBody2D, он ходит по коду. Давай узлам понятные имена — Spikes, Enemy, Portal: через десяток «Node2D3» ты сам не вспомнишь, где что.
  • 2Свиток — прикрепить скриптОдин и тот же spike.gd вешают и на шипы, и на зону HitZone внутри краба: хороший код пишут один раз, а вешают на десять объектов. На кадре свиток с красным крестиком, потому что у выделенного Player скрипт уже есть; на узле без скрипта на свитке будет зелёный плюс.
  • 3Линейки вьюпорта — отсюда берут маршрутЧисла 0, 500, 1000 сверху и слева — это координаты сцены. Поставь краба в левый конец тропы и посмотри его Position X — получишь min_x; перетащи в правый конец — max_x. Position лежит ниже видимого края Инспектора, в разделе Transform: крути колесом прямо внутри панели.
  • 4Поля из @export — ручки твоего крабаНа кадре это Speed и Jump Force героя. У краба на этом же месте появятся min_x, max_x и speed: левая граница тропы, правая и скорость шага. Оставишь нули — краб стартует влево и уползёт с карты навсегда, потому что условие «дошёл до границы» не сработает уже никогда.
  • 5Запуск — проверь все три опасностиТреугольник или F5. По очереди: краб доходит до края тропы и разворачивается, шипы перезапускают уровень, портал открывает второй. Уровень перезапускается сам собой, хотя ты стоишь на месте, — значит, в spike.gd нет проверки if body.name == "Player", и шипы срабатывают от монеты или от самого краба.
Отмечено:0 из 5

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

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

Задание Гильдии: сделай врага, который патрулирует по вертикали — летающего. Подсказка: поменяй в коде velocity.x на velocity.y, position.x на position.y. Гравитацию убирать не надо — в enemy.gd её и не было, поэтому летающий краб просто зависнет там, куда ты его поставишь.

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

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

Уровень стал опасным: шипы, враги с маршрутами и портал на второй этап. Печать СТРАЖ УРОВНЯ.

Что дальше. Тео снимает со стены гарпун: «Крабов больше, чем твоей смелости. Пора отвечать».

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

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

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

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