Узлы как компоненты
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 42 из 65.
У узла Node могут быть дочерние узлы. Godot создает игровые объекты таким образом: у узла героя есть по одному дочернему узлу на каждую способность, например здоровье или передвижение. Каждый дочерний узел — это компонент: небольшой узел, который выполняет одну задачу.
# health.gd
class_name Health
extends Node
var hp := 10
func _ready() -> void:
print("Health ready")
# hero.gd
class_name Hero
extends Node
func _init() -> void:
var health := Health.new()
health.name = "Health"
add_child(health)
func _ready() -> void:
print("Hero ready, hp: ", $Health.hp)add_child() добавляет узел в качестве дочернего. Задай каждому компоненту name: get_node("Health") или его краткая форма $Health находит дочерний узел по этому имени. Узел без имени или с именем, которое уже занято соседним узлом, получает автоматическое имя, например @Node@4.
Метод _ready() узла выполняется, когда узел попадает в дерево сцены — дерево узлов, в котором работает игра. main.gd находится в дереве, поэтому добавление героя в него запускает оба метода _ready(), сначала у дочернего узла:
# main.gd
var hero := Hero.new()
add_child(hero) # Сначала готов Health, затем Hero, hp: 10
print(hero.get_child_count()) # 1Родительский узел получает доступ к своим компонентам с помощью get_children() (массива дочерних узлов в порядке их добавления), get_child_count() и has_node("Health"). Узлы в дереве освобождаются вместе с деревом, когда игра заканчивается, поэтому компонент, добавленный с помощью add_child(), не требует очистки.
Задание
ЛегкоСоздай робота из узлов-компонентов.
PartрасширяетNode. Его конструктор получает имя детали и значение мощности: он сохраняет мощность и задаёт узлуname, равное имени детали. Когда деталь попадает в дерево сцены, её_ready()выводитLaser attached.RobotрасширяетNode.add_part(part_name, power)добавляет новуюPartв качестве дочернего узла. Если у робота уже есть дочерний узел с таким именем, он выводитLaser is already attachedи ничего не создаёт.total_power()возвращает сумму мощностей всех его деталей.
Предоставленный код добавляет робота в дерево сцены, считывает количество следующих команд (add Laser 5, power) и в конце выводит количество деталей. Для команд add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power он выводит:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Твой код нужно поместить в part.gd и robot.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
var robot := Robot.new()
add_child(robot)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
robot.add_part(parts[1], int(parts[2]))
else:
print("Total power: ", robot.total_power())
print("Parts: ", robot.get_child_count())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript