Menu
CoddyTech

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

Un 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é.

challenge icon

Défi

Facile

Construis un robot à partir de nœuds composants.

  • Part étend Node. Son constructeur reçoit un nom de pièce et une valeur de puissance : il stocke la puissance et définit name du nœud sur le nom de la pièce. Lorsqu’une pièce entre dans l’arbre de scène, son _ready() affiche Laser attached.
  • Robot étend Node. add_part(part_name, power) ajoute un nouveau Part comme enfant. Si le robot a déjà un enfant portant ce nom, il affiche Laser is already attached et 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: 3

Ton 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())
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne