Узлы — кирпичики игры

Узел (Node) — это самый маленький кирпичик игры в Godot: один узел умеет делать одну вещь.

Суть: игра в Godot собирается из узлов, как конструктор из деталек — каждая деталь отвечает за что-то одно.

В Godot всё — узлы. Спрайт персонажа — это узел. Надпись с количеством очков — узел. Звук выстрела — узел. Область, которая ловит столкновения, — тоже узел. Идея в том, чтобы каждый узел делал ровно одну работу и делал её хорошо. Тебе не нужно писать «узел, который рисует картинку»: такой уже есть, он называется Sprite2D. Не нужно писать «узел, который показывает текст»: есть Label.

У каждого узла есть свойства — настройки, которые можно менять. У Sprite2D это, например, картинка (texture), позиция (position) и масштаб (scale). У Label — сам текст и шрифт. Свойства можно крутить мышкой в редакторе или менять из кода. Кроме свойств у узлов есть поведение: специальные функции, которые движок вызывает сам в нужный момент. Самая известная — _ready(), которая срабатывает один раз, когда узел появился в игре.

Узлов в Godot сотни, но на старте тебе хватит десятка. Вот базовые для 2D:

УзелЗа что отвечает
Node2DБаза для 2D: даёт позицию, поворот, масштаб
Sprite2DПоказывает картинку
LabelПоказывает текст
CharacterBody2DУправляемый персонаж с физикой
Area2DОбласть, которая ловит вход и выход объектов
AudioStreamPlayerПроигрывает звук

Полезно держать в голове, что узлы умеют не только хранить свойства, но и общаться: они образуют дерево, шлют друг другу сигналы и могут находить друг друга по имени. Но это потом. Сейчас важно усвоить главную мысль: вместо того чтобы писать всё с нуля, ты комбинируешь готовые узлы. Захотел текст — взял Label. Захотел звук — взял AudioStreamPlayer. Захотел область, ловящую вход, — взял Area2D. Программирование в Godot во многом сводится к выбору правильных узлов и настройке их свойств, а свой код ты пишешь лишь там, где нужно нестандартное поведение.

Как работает под капотом

Когда движок создаёт узел, он выделяет под него кусочек памяти, заполняет свойства значениями по умолчанию и кладёт узел в дерево игры. Дальше движок каждый кадр обходит все узлы и даёт каждому возможность поработать. Узел — это, по сути, объект с данными (свойствами) и поведением (функциями). Если ты знаком с классами в Python, узел — это экземпляр класса.

Смоделируем узел на Python как обычный объект. У него есть свойства и метод _ready, который движок «зовёт» при появлении узла.

class Sprite2D:
    def __init__(self, texture):
        self.texture = texture     # картинка
        self.position = (0, 0)     # позиция на экране
        self.visible = True

    def _ready(self):
        print(f"Спрайт '{self.texture}' появился на {self.position}")

# Движок создаёт узел и зовёт _ready
player = Sprite2D("player.png")
player.position = (100, 50)
player._ready()

player.visible = False
print("Спрятали спрайт:", player.visible)

Та же логика на Python ▶. Узел — это объект со свойствами и функциями-обработчиками. В GDScript ты пишешь почти то же самое, только наследуешься от готового класса узла.

Запомни ещё один практический момент: у любого узла можно посмотреть полный список его свойств и сигналов прямо в редакторе и в документации. Не нужно держать всё в голове или угадывать имена. Выделил узел — увидел в инспекторе все его настройки; навёл на свойство — прочитал подсказку. Это превращает изучение Godot из зубрёжки в исследование: ты не учишь сотни узлов наизусть, а по мере надобности открываешь нужный и смотришь, что он умеет. Такой навык — читать встроенную справку — пригодится тебе сильнее, чем заученный список имён.

Частые ошибки

Главная ошибка новичка — пытаться запихнуть всё в один гигантский узел. Не делай узел «персонаж-который-ещё-и-рисует-интерфейс-и-играет-музыку». Разбей на несколько узлов, каждый со своей задачей. Вторая ошибка — путать узел и его свойства: позиция это не отдельный узел, а свойство узла Node2D. Третья — искать в коде свойство по неправильному имени: в Godot 4 это position, а не pos, и texture, а не image. Имена лучше подсматривать в редакторе.

Best practices

Давай узлам понятные имена: не Node2D и Node2D2, а Player, Coin, ScoreLabel. По имени узла должно быть ясно, что это. Выбирай самый специфичный подходящий узел: если нужно показать текст — бери Label, а не лепи текст руками на Node2D. И помни принцип «один узел — одна ответственность»: так игру будет легче чинить и расширять.

Итоги: узел — минимальный кирпичик игры, отвечает за одну вещь. У узлов есть свойства (настройки) и поведение (функции, которые зовёт движок). Базовых узлов для 2D около десятка: Sprite2D рисует, Label пишет, CharacterBody2D — это персонаж. Давай узлам понятные имена и не перегружай один узел.

Проверьте себя
1. Какой узел отвечает за показ картинки на экране в 2D?
ALabel
BSprite2D
CAudioStreamPlayer
DTimer
2. Что такое свойство узла?
AОтдельный маленький узел внутри большого
BНастройка узла, например позиция или текст
CИмя файла проекта
DЗвук, который издаёт узел