Menu
CoddyTech

Nodi come componenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 42 di 65.

Un Node può avere nodi figli. Godot crea gli oggetti di gioco in questo modo: un nodo eroe riceve un nodo figlio per ogni abilità, come la salute o il movimento. Ogni figlio è un componente: un piccolo nodo che svolge un compito.

# 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() aggiunge un nodo come figlio. Assegna a ogni componente un name: get_node("Health"), o la sua forma abbreviata $Health, trova il figlio con quel nome. Un nodo senza nome, o con un nome già assegnato a un nodo fratello, ne riceve uno automatico, come @Node@4.

Il metodo _ready() di un nodo viene eseguito quando entra nello scene tree, l'albero di nodi in cui è in esecuzione il gioco. main.gd si trova nell'albero, quindi aggiungere l'eroe a esso avvia entrambi i metodi _ready(), prima quello del figlio:

# main.gd
var hero := Hero.new()
add_child(hero)            # Health pronto, poi Hero pronto, hp: 10
print(hero.get_child_count())   # 1

Un nodo genitore raggiunge i suoi componenti con get_children() (un array dei nodi figli, nell'ordine in cui sono stati aggiunti), get_child_count() e has_node("Health"). I nodi nell'albero vengono liberati insieme all'albero quando il gioco termina, quindi un componente aggiunto con add_child() non richiede pulizia.

challenge icon

Sfida

Facile

Costruisci un robot con nodi componente.

  • Part estende Node. Il suo costruttore riceve un nome di componente e un valore di potenza: memorizza la potenza e imposta name del nodo sul nome del componente. Quando un componente entra nell'albero della scena, il suo _ready() stampa Laser attached.
  • Robot estende Node. add_part(part_name, power) aggiunge un nuovo Part come figlio. Se il robot ha già un figlio con quel nome, stampa Laser is already attached e non crea nulla.
  • total_power() restituisce la somma della potenza di tutti i suoi componenti.

Il codice fornito aggiunge il robot all'albero della scena, legge quanti comandi seguono (add Laser 5, power) e stampa il numero di componenti alla fine. Per add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power stampa:

Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3

Il tuo codice va in part.gd e robot.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Supplied input/output code: keep it as it is
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online