Нажми — и увидишь, что делает команда
- ⏱ Сколько займёт
- 30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Godot — бесплатный, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- сигналы · глобальная копилка · счёт и условие победы
Зона, которая чувствует
Из воды в трюме что-то блеснуло. Ещё раз. Дублоны — целый сундук раскрылся при качке.
Боцман Клык свешивается в люк: «Юнга! Всё, что соберёшь, твоё. Но команда должна видеть счёт — иначе скажут, что ты прикарманил».
Значит, нужен счётчик, который видно всем. И правило: собрал все — люк открывается.
Это записано в самом Godot — движок посчитал физику и нарисовал каждый кадр. К концу квеста такая же игра будет запускаться у тебя.
Читать текстом
Уровень без цели — это прогулка. Сегодня добавим цель.
Area2D — третий тип тела и самый хитрый. Он ничего не останавливает, зато замечает: «в меня кто-то вошёл». На этом держатся монеты, шипы, порталы и зоны победы во всех платформерах мира.

- 1Монета Coin в дереве — и два её ребёнкаПКМ по Level → «Добавить дочерний узел» → Area2D, переименуй в Coin. Внутрь — Sprite2D с картинкой и CollisionShape2D с кругом: без формы монета ничего не почувствует. На кадре она выделена, поэтому дети видны прямо под ней.
- 2Свиток с зелёным плюсом — скрипт монетеСначала повесь на Coin скрипт res://scripts/coin.gd и только потом подключай сигнал — иначе Godot будет некуда писать функцию. Скрипт должен висеть именно на Coin, а не на её картинке: это ошибка номер один в этом квесте.
- 3Вкладка «Сигналы» — рядом с ИнспекторомВ задании её называют «Узел» — в этой версии Godot она подписана «Сигналы» и стоит справа от «Инспектора». Работает только тогда, когда узел выделен, и показывает события именно этого узла. У Area2D их вон сколько — и все про то, кто вошёл и кто вышел.
- 4Строка body_entered — «в меня вошло тело»Двойной клик по ней. Не путай с area_entered из верхней строчки: та срабатывает на другие зоны, а герой у нас тело — значит, нужна body_entered(body: Node2D). Ниже есть body_exited, «вышел», — в этом квесте она не нужна.
- 5Кнопка «Присоединить…»Открывает окно, где выбирают узел со скриптом — это Coin — и жмут «Присоединить». Godot сам допишет в coin.gd пустую func _on_body_entered(body), а слева от неё поставит зелёный значок: знак, что сигнал подключён. Нет значка — код никто не позовёт, и монета не исчезнет.
Это настоящий экран Godot: в дереве выделена монета Coin, и справа открыта вкладка «Сигналы» — список событий, о которых узел умеет сообщать. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.
Монета исчезает
extends Area2D func _on_body_entered(body: Node2D) -> void: queue_free() # монета удаляет себя из игры
queue_free() — «удали меня, когда будет удобно». Godot дождётся конца кадра и уберёт узел вместе со всеми его детьми.Запусти (F5) и добеги до монеты. Она исчезнет.
Coin, а не на его картинке. Три: у монеты есть CollisionShape2D — без формы она ничего не почувствует.Копилка, которая переживёт монеты
В Godot такая штука называется автозагрузка: скрипт, который запускается вместе с игрой и доступен отовсюду.
extends Node var coins: int = 0 # глобальная копилка
scripts/game_manager.gd; в поле «Имя узла» Godot сам подставит GameManager — проверь регистр букв; жми «Добавить». Строка появится в списке снизу с галочкой «Включить». Теперь из любого скрипта можно написать GameManager.coins.Две строки — а меняют всю архитектуру игры.
extends Area2D func _on_body_entered(body: Node2D) -> void: GameManager.coins += 1 # сначала записали в копилку queue_free() # и только потом исчезли
queue_free(), монета может исчезнуть до того, как добавит себя к счёту.
Зачем игры звенят монетами
Монета в играх почти никогда не нужна для победы. Она нужна, чтобы сказать игроку: ты идёшь правильно.
Дизайнеры расставляют монеты дорожкой — и игрок сам, без подсказок, бежит туда, куда задумано. Приём называют «хлебные крошки», ему больше сорока лет, и он до сих пор работает.
Добавь к этому звон и вспышку — и мозг получает крошечную награду. Из таких мелких наград и складывается «не могу оторваться».
Счёт на экране
- 1ПКМ по Level → CanvasLayerСлой, который не ездит вместе с камерой. Положишь Label прямо в уровень — счёт уедет за край экрана.
- 2Внутрь CanvasLayer — LabelНазови
CoinsLabel, текст «Монеты: 0», перетащи в левый верхний угол. - 3Перетащи файл шрифта .ttf в проектБери шрифт с кириллицей — Russo One или Press Start 2P. Иначе русские буквы станут квадратиками.
- 4Инспектор → Theme OverridesРаскрой группу. Шрифт перетащи в Fonts → Font, а размер задаётся в соседней группе — Font Sizes → Font Size, поставь 36–48. Это два разных места, их часто путают.
Почему именно CanvasLayer? Если положить Label прямо в уровень, счёт уедет за край экрана вместе с камерой.
extends Label func _process(_delta: float) -> void: text = "Монеты: " + str(GameManager.coins)
str() превращает число в текст. Без неё Godot откажется склеивать текст с числом — это разные вещи, как яблоки и слова. Подчёркивание в _delta означает «эта переменная мне не нужна».Челлендж: собери всё
extends Label func _process(_delta: float) -> void: if GameManager.coins >= 10: text = "Все дублоны собраны — люк открыт!" else: text = "Монеты: " + str(GameManager.coins)
Разбросай по уровню ровно десять монет — столько же, сколько в условии победы, — часть на высоких платформах, чтобы за ними пришлось попрыгать. Поменяешь количество — не забудь поменять и число в коде.
coins лежит в GameManager, а не в скрипте монеты?Читать текстом
Задание Гильдии: сделай монетный дождь — расставь монеты так, чтобы за самой дальней пришлось прыгать через дыру. И попробуй придумать вторую награду: например, красную монету, которая даёт сразу пять.
Поднимай флаг — экспедиция «Испытание юнги» закрыта.