Menu
CoddyTech

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())   # 1

Rodzic 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.

challenge icon

Wyzwanie

Łatwy

Zbuduj robota z węzłów będących komponentami.

  • Part rozszerza Node. Jego konstruktor otrzymuje nazwę części i wartość mocy: zapisuje moc i ustawia name węzła na nazwę części. Gdy część pojawi się w drzewie sceny, jej _ready() wypisuje Laser attached.
  • Robot rozszerza Node. add_part(part_name, power) dodaje nowy obiekt Part jako dziecko. Jeśli robot ma już dziecko o tej nazwie, wypisuje Laser is already attached i 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: 3

Twó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())
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online