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()) # 1Un 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.
Desafío
FácilConstruye un robot a partir de nodos de componentes.
PartextiendeNode. Su constructor recibe un nombre de pieza y un valor de potencia: almacena la potencia y establece elnamedel nodo con el nombre de la pieza. Cuando una pieza entra en el árbol de escena, su_ready()imprimeLaser attached.RobotextiendeNode.add_part(part_name, power)añade un nuevoPartcomo hijo. Si el robot ya tiene un hijo con ese nombre, imprimeLaser is already attachedy 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: 3Tu 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())
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
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online