Les nœuds comme composants
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 42 sur 65.
Un Node peut avoir des nœuds enfants. Godot construit les objets de jeu de cette façon : un nœud de héros reçoit un nœud enfant pour chaque capacité, comme la santé ou le déplacement. Chaque enfant est un composant : un petit nœud qui effectue une seule tâche.
# 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() attache un nœud en tant qu’enfant. Donne un name à chaque composant : get_node("Health"), ou sa forme abrégée $Health, trouve l’enfant portant ce nom. Un nœud sans nom, ou dont le nom est déjà pris par un nœud frère, en reçoit un automatiquement, comme @Node@4.
La méthode _ready() d’un nœud s’exécute lorsqu’il entre dans l’arbre de scène, l’arbre des nœuds dans lequel le jeu s’exécute. main.gd se trouve dans l’arbre, donc lui ajouter le héros lance les deux méthodes _ready(), d’abord celle de l’enfant :
# main.gd
var hero := Hero.new()
add_child(hero) # Health est prêt, puis Hero est prêt, hp: 10
print(hero.get_child_count()) # 1Un parent accède à ses composants avec get_children() (un tableau des enfants, dans l’ordre où ils ont été ajoutés), get_child_count() et has_node("Health"). Les nœuds de l’arbre sont libérés avec l’arbre lorsque le jeu se termine ; un composant ajouté avec add_child() n’a donc pas besoin d’être nettoyé.
Défi
FacileConstruis un robot à partir de nœuds composants.
PartétendNode. Son constructeur reçoit un nom de pièce et une valeur de puissance : il stocke la puissance et définitnamedu nœud sur le nom de la pièce. Lorsqu’une pièce entre dans l’arbre de scène, son_ready()afficheLaser attached.RobotétendNode.add_part(part_name, power)ajoute un nouveauPartcomme enfant. Si le robot a déjà un enfant portant ce nom, il afficheLaser is already attachedet ne crée rien.total_power()renvoie la somme des puissances de toutes ses pièces.
Le code fourni ajoute le robot à l’arbre de scène, lit le nombre de commandes qui suivent (add Laser 5, power), puis affiche le nombre de pièces à la fin. Pour add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power, il affiche :
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Ton code va dans part.gd et robot.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : laissez-le tel quel
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())
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne