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()) # 1Un 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.
Sfida
FacileCostruisci un robot con nodi componente.
PartestendeNode. Il suo costruttore riceve un nome di componente e un valore di potenza: memorizza la potenza e impostanamedel nodo sul nome del componente. Quando un componente entra nell'albero della scena, il suo_ready()stampaLaser attached.RobotestendeNode.add_part(part_name, power)aggiunge un nuovoPartcome figlio. Se il robot ha già un figlio con quel nome, stampaLaser is already attachede 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: 3Il 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())
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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online