Węzły jako komponenty
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 42 z 65.
Węzeł Node może mieć węzły potomne. Godot tworzy w ten sposób obiekty gry: węzeł bohatera otrzymuje po jednym węźle potomnym dla każdej umiejętności, takiej jak zdrowie czy poruszanie się. Każdy węzeł potomny to komponent: mały węzeł, który wykonuje jedno zadanie.
# 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() dołącza węzeł jako element podrzędny. Nadaj każdemu komponentowi name: get_node("Health") lub jego krótsza forma $Health wyszukuje element podrzędny o tej nazwie. Węzeł bez nazwy lub z nazwą zajętą przez węzeł siostrzany otrzymuje nazwę automatyczną, taką jak @Node@4.
Metoda _ready() węzła uruchamia się, gdy węzeł trafia do drzewa sceny, czyli drzewa węzłów, które uruchamia gra. main.gd znajduje się w drzewie, więc dodanie do niego bohatera uruchamia obie metody _ready(), najpierw tę należącą do elementu podrzędnego:
# main.gd
var hero := Hero.new()
add_child(hero) # Health jest gotowy, potem Hero jest gotowy, hp: 10
print(hero.get_child_count()) # 1Rodzic uzyskuje dostęp do swoich komponentów za pomocą get_children() (tablicy dzieci w kolejności, w jakiej zostały dodane), get_child_count() i has_node("Health"). Węzły w drzewie są zwalniane razem z drzewem po zakończeniu gry, więc komponent dodany za pomocą add_child() nie wymaga sprzątania.
Wyzwanie
ŁatwyZbuduj robota z węzłów będących komponentami.
PartrozszerzaNode. Jego konstruktor otrzymuje nazwę części i wartość mocy: zapisuje moc i ustawianamewęzła na nazwę części. Gdy część pojawi się w drzewie sceny, jej_ready()wypisujeLaser attached.RobotrozszerzaNode.add_part(part_name, power)dodaje nowy obiektPartjako dziecko. Jeśli robot ma już dziecko o tej nazwie, wypisujeLaser is already attachedi niczego nie tworzy.total_power()zwraca sumę mocy wszystkich jego części.
Dostarczony kod dodaje robota do drzewa sceny, odczytuje liczbę kolejnych poleceń (add Laser 5, power) i na końcu wypisuje liczbę części. Dla poleceń add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power wypisuje:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Twój kod umieść w plikach part.gd i robot.gd. main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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())
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online