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

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

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

Зона, которая чувствует

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

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

Боцман Клык свешивается в люк: «Юнга! Всё, что соберёшь, твоё. Но команда должна видеть счёт — иначе скажут, что ты прикарманил».

Значит, нужен счётчик, который видно всем. И правило: собрал все — люк открывается.

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

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

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

Уровень без цели — это прогулка. Сегодня добавим цель.

ТРИ ВИДА ТЕЛ
ТВЁРДОЕ, НЕПОДВИЖНОЕ
StaticBody2D
Платформа. Об неё бьются, на неё встают.
ТВЁРДОЕ, ХОДЯЧЕЕ
CharacterBody2D
Герой. Слушается кода, упирается в стены.
НЕ ТВЁРДОЕ, НО ЧУВСТВУЕТ
Area2D
Монета, ловушка, дверь. Сквозь неё проходят — и она об этом узнаёт.

Area2D — третий тип тела и самый хитрый. Он ничего не останавливает, зато замечает: «в меня кто-то вошёл». На этом держатся монеты, шипы, порталы и зоны победы во всех платформерах мира.

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

Это настоящий экран Godot: в дереве выделена монета Coin, и справа открыта вкладка «Сигналы» — список событий, о которых узел умеет сообщать. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.

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

Монета исчезает

ЗАДАНИЕ 2 · КОД МОНЕТЫ
coin.gdGDSCRIPT
extends Area2D

func _on_body_entered(body: Node2D) -> void:
	queue_free()  # монета удаляет себя из игры
Две строки — и монета работает. queue_free() — «удали меня, когда будет удобно». Godot дождётся конца кадра и уберёт узел вместе со всеми его детьми.

Запусти (F5) и добеги до монеты. Она исчезнет.

РАЗБОР ОШИБКИ
ЕСЛИ НЕ РАБОТАЕТ
Проверь три вещи. Раз: рядом с функцией в редакторе есть зелёный значок подключённого сигнала — без него код просто никто не вызовет. Два: скрипт висит именно на Coin, а не на его картинке. Три: у монеты есть CollisionShape2D — без формы она ничего не почувствует.
Касание монеты героем — что это в терминах Godot?
Переменная
Сигнал — событие, о котором узел сообщает
Функция
ШАГ 3 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 3

Копилка, которая переживёт монеты

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

В Godot такая штука называется автозагрузка: скрипт, который запускается вместе с игрой и доступен отовсюду.

ЗАДАНИЕ 3 · ГЛОБАЛЬНАЯ КОПИЛКА
scripts/game_manager.gdGDSCRIPT
extends Node

var coins: int = 0  # глобальная копилка
Проект → Настройки проекта → вкладка «Автозагрузка» (в списке вкладок сверху, рядом с «Картой действий»). В поле «Путь» нажми на папку и выбери scripts/game_manager.gd; в поле «Имя узла» Godot сам подставит GameManager — проверь регистр букв; жми «Добавить». Строка появится в списке снизу с галочкой «Включить». Теперь из любого скрипта можно написать GameManager.coins.

Две строки — а меняют всю архитектуру игры.

ОБНОВИ КОД МОНЕТЫ
coin.gdGDSCRIPT
extends Area2D

func _on_body_entered(body: Node2D) -> void:
	GameManager.coins += 1   # сначала записали в копилку
	queue_free()             # и только потом исчезли
Порядок важен: если сначала queue_free(), монета может исчезнуть до того, как добавит себя к счёту.
ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Зачем игры звенят монетами

Монета в играх почти никогда не нужна для победы. Она нужна, чтобы сказать игроку: ты идёшь правильно.

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

Добавь к этому звон и вспышку — и мозг получает крошечную награду. Из таких мелких наград и складывается «не могу оторваться».

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

Счёт на экране

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

Почему именно CanvasLayer? Если положить Label прямо в уровень, счёт уедет за край экрана вместе с камерой.

КОД СЧЁТЧИКА
scripts/coins_label.gdGDSCRIPT
extends Label

func _process(_delta: float) -> void:
	text = "Монеты: " + str(GameManager.coins)
str() превращает число в текст. Без неё Godot откажется склеивать текст с числом — это разные вещи, как яблоки и слова. Подчёркивание в _delta означает «эта переменная мне не нужна».
Зачем в этой строке нужна str()?
Чтобы превратить число в текст — иначе склеить не получится
Чтобы округлить число
Так просто принято писать
ШАГ 5 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 3

Челлендж: собери всё

ЗАДАНИЕ 5 · ФИНАЛЬНОЕ
scripts/coins_label.gdGDSCRIPT
extends Label

func _process(_delta: float) -> void:
	if GameManager.coins >= 10:
		text = "Все дублоны собраны — люк открыт!"
	else:
		text = "Монеты: " + str(GameManager.coins)
Подставь вместо 10 своё число монет. Это первое в твоей игре условие победы — момент, когда игра говорит «ты справился».

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

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

Задание Гильдии: сделай монетный дождь — расставь монеты так, чтобы за самой дальней пришлось прыгать через дыру. И попробуй придумать вторую награду: например, красную монету, которая даёт сразу пять.

Поднимай флаг — экспедиция «Испытание юнги» закрыта.

Экспедиция закрыта!

Платформер с монетами, счётом и победой собран целиком. Гильдия присваивает печать ХРАНИТЕЛЬ КАЗНЫ и ранг Ученик Гильдии.

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

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

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

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

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