Menu
CoddyTech

Nodos como componentes

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 42 de 65.

Un Node puede tener nodos secundarios. Godot crea objetos de juego de esta manera: un nodo de héroe tiene un nodo secundario por cada habilidad, como la salud o el movimiento. Cada nodo secundario es un componente: un nodo pequeño que realiza una tarea.

# 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() adjunta un nodo como hijo. Dale a cada componente un name: get_node("Health"), o su forma abreviada $Health, encuentra el hijo por ese nombre. Un nodo sin nombre, o cuyo nombre ya está ocupado por un hermano, recibe uno automático como @Node@4.

El método _ready() de un nodo se ejecuta cuando este entra en el árbol de escena, el árbol de nodos en el que se ejecuta el juego. main.gd está en el árbol, así que añadirle el héroe inicia ambos métodos _ready(), primero el del hijo:

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

Un nodo padre accede a sus componentes con get_children() (un arreglo de los nodos secundarios, en el orden en que se agregaron), get_child_count() y has_node("Health"). Los nodos del árbol se liberan junto con el árbol cuando termina el juego, así que un componente que se agregó con add_child() no necesita limpieza.

challenge icon

Desafío

Fácil

Construye un robot a partir de nodos de componentes.

  • Part extiende Node. Su constructor recibe un nombre de pieza y un valor de potencia: almacena la potencia y establece el name del nodo con el nombre de la pieza. Cuando una pieza entra en el árbol de escena, su _ready() imprime Laser attached.
  • Robot extiende Node. add_part(part_name, power) añade un nuevo Part como hijo. Si el robot ya tiene un hijo con ese nombre, imprime Laser is already attached y no crea nada.
  • total_power() devuelve la suma de la potencia de todas sus piezas.

El código proporcionado añade el robot al árbol de escena, lee cuántos comandos siguen (add Laser 5, power) e imprime al final el número de piezas. Para add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power imprime:

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

Tu código va en part.gd y robot.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online