Узлы — кирпичики игры
Узел (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 — это персонаж. Давай узлам понятные имена и не перегружай один узел.