1. Узлы и сцены в Godot
Любая игра, созданная в движке Godot, строится на двух фундаментальных концепциях: узлах и сценах. Понимание того, как они работают и взаимодействуют друг с другом, является ключом к созданию любых механик — от простого перемещения персонажа до сложной системы защиты базы с использованием магических способностей.
Что такое узел (Node)
Узел (Node) — это мельчайший строительный блок в Godot. Каждый узел выполняет одну конкретную, узконаправленную задачу.
Представьте себе конструктор Lego. Отдельная деталь — это узел. У вас есть деталь-колесо, деталь-мотор, деталь-руль и деталь-фара. Сами по себе они не являются машиной, но каждая из них имеет свою четкую функцию.
В разработке игр на Godot принцип абсолютно такой же. Движок предоставляет сотни готовых узлов, каждый из которых отвечает за свою часть работы:
* Один узел умеет рисовать картинку на экране. * Другой узел умеет проигрывать звуковой эффект. * Третий узел работает как невидимый таймер, отсчитывающий секунды. * Четвертый узел определяет физические границы объекта, чтобы он мог сталкиваться с другими.
> Узел — это базовый элемент игры, обладающий определенными свойствами (например, позицией на экране) и способный выполнять специфические действия.
Для создания гибрида Plants vs. Zombies и Blox Fruits вам понадобятся узлы, которые будут отвечать за отображение магических фруктов-защитников, отслеживание врагов на линии и расчет времени перезарядки способностей.
Основные типы узлов для 2D-игры
В таблице ниже приведены наиболее часто используемые узлы, с которыми вы будете работать при создании своей первой игры:
| Название узла | Зачем нужен в игре | Пример использования в вашем проекте |
| :--- | :--- | :--- |
| Sprite2D | Отображает 2D-изображение (текстуру). | Картинка магического фрукта или анимация идущего врага. |
| Area2D | Обнаруживает пересечения с другими объектами. | Зона видимости защитника: как только враг входит в эту зону, фрукт начинает атаковать. |
| CollisionShape2D | Задает физическую форму (круг, прямоугольник) для столкновений. | Хитбокс врага, по которому должен попасть магический снаряд. |
| Timer | Отсчитывает время и подает сигнал по завершении. | Перезарядка атаки: фрукт стреляет огненным шаром строго раз в 1.5 секунды. |
| CharacterBody2D | Узел для объектов, которыми управляет физика или игрок. | Враг, который движется по линии и останавливается, если упирается в защитника. |
Что такое сцена (Scene)
Если узел — это отдельная деталь Lego, то сцена (Scene) — это собранная из этих деталей готовая конструкция. Например, собранный из колес, мотора и кабины автомобиль.
Сцена в Godot — это просто набор узлов, организованных в определенном порядке и сохраненных в один файл (с расширением .tscn). Сцена представляет собой самостоятельный игровой объект.
В вашей игре сценами будут:
Прелесть Godot заключается в том, что сцены могут содержать в себе другие сцены. Ваш главный уровень — это большая сцена, внутрь которой вы будете помещать сцены защитников и врагов.
Иерархия: Родительские и дочерние узлы
Узлы внутри сцены не просто свалены в кучу. Они организованы в строгую древовидную структуру, которая называется деревом сцен (Scene Tree). В этом дереве всегда есть один главный узел (корневой), а все остальные подчиняются ему.
Здесь возникает концепция родительских (Parent) и дочерних (Child) узлов.
Правило иерархии очень простое: дочерние узлы наследуют трансформацию (позицию, вращение и масштаб) своего родителя.
Если родительский узел перемещается в координаты и , то все его дочерние узлы автоматически переместятся вместе с ним. Это критически важно для разработки. Когда ваш враг идет по линии, вам не нужно отдельно двигать его картинку (Sprite2D), его хитбокс (CollisionShape2D) и его полоску здоровья. Вы двигаете только родительский узел, а все остальные элементы, будучи дочерними, послушно следуют за ним.
Экземпляры сцен (Instancing)
Представьте, что игрок накопил достаточно энергии и хочет поставить на поле сразу пять одинаковых огненных фруктов. Вам не нужно пять раз собирать узлы Sprite2D, Area2D и Timer с нуля.
Вместо этого вы создаете экземпляр (Instance) сцены.
Экземпляр — это копия сохраненной сцены, помещенная в другую сцену. Вы один раз создаете идеального защитника, настраиваете его урон, радиус атаки и картинку, сохраняете как сцену fire_fruit.tscn, а затем просто создаете ее экземпляры на игровом поле столько раз, сколько захочет игрок.
Главное преимущество экземпляров — централизованное управление. Если в процессе тестирования игры вы поймете, что огненный фрукт наносит слишком мало урона, вам не придется менять настройки у каждого из пятидесяти фруктов на уровне. Вы открываете оригинальную сцену fire_fruit.tscn, увеличиваете урон там, и все экземпляры в игре автоматически обновляются.
Практический пример: Создание базового защитника
Давайте рассмотрим, как концепция узлов и сцен применяется на практике при создании вашего первого защитника — магического фрукта, который будет стоять на клетке и атаковать врагов.
Area2D в качестве корневого узла. Этот узел идеально подходит для защитника, так как он не должен двигаться под воздействием гравитации, но должен уметь обнаруживать врагов, входящих в его зону поражения. Назовем этот узел MagicDefender.MagicDefender вы добавляете дочерний узел Sprite2D. В его настройках вы выбираете текстуру (картинку) вашего фрукта. Теперь защитника видно на экране.Area2D понимал, где именно находится фрукт и какие у него размеры, вы добавляете еще один дочерний узел — CollisionShape2D. В его настройках вы выбираете форму (например, прямоугольник) и растягиваете ее так, чтобы она покрывала картинку фрукта.Timer. В его настройках выставляете время (например, 2 секунды) и включаете автозапуск.В результате у вас получается небольшое дерево узлов:
MagicDefender (Area2D) — корневой узел, отвечает за позицию на сетке и обнаружение врагов*
Sprite2D — дочерний узел, отвечает за красоту*
CollisionShape2D — дочерний узел, отвечает за физические границы*
Timer — дочерний узел, отвечает за ритм стрельбы*
Вы сохраняете эту конструкцию. Теперь это полноценная сцена.
Чтобы заставить эту сцену работать, к корневому узлу прикрепляется скрипт — текстовый файл с кодом на языке GDScript. Скрипт позволяет узлам общаться между собой. Например, когда узел Timer заканчивает отсчет, он подает сигнал скрипту, а скрипт отдает команду создать экземпляр огненного шара и запустить его во врага.
Использование узлов и сцен делает архитектуру игры модульной. Вы собираете сложные механизмы из простых, понятных деталей, которые легко настраивать, изменять и использовать повторно. В следующих этапах разработки этот принцип позволит вам легко добавлять новые типы фруктов и врагов, просто комбинируя уже знакомые узлы по-новому.