Menu
CoddyTech

Nós como Componentes

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 42 de 65.

Um Node pode ter nós filhos. O Godot cria objetos de jogo dessa forma: um nó de herói recebe um nó filho para cada habilidade, como saúde ou movimento. Cada filho é um componente: um nó pequeno que faz uma única tarefa.

# 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() anexa um nó como filho. Dê a cada componente um name: get_node("Health"), ou sua forma abreviada $Health, encontra o filho por esse nome. Um nó sem nome, ou cujo nome já pertence a um nó irmão, recebe um nome automático, como @Node@4.

O _ready() de um nó é executado quando ele entra na árvore de cena, a árvore de nós em que o jogo está sendo executado. main.gd está na árvore, então adicionar o herói a ela inicia os dois métodos _ready(), primeiro o do filho:

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

Um nó pai acessa seus componentes com get_children() (um array dos nós filhos, na ordem em que foram adicionados), get_child_count() e has_node("Health"). Os nós na árvore são liberados junto com ela quando o jogo termina, então um componente adicionado com add_child() não precisa de limpeza.

challenge icon

Desafio

Fácil

Monte um robô a partir de nós de componentes.

  • Part estende Node. Seu construtor recebe um nome de peça e um valor de potência: ele armazena a potência e define o name do nó como o nome da peça. Quando uma peça entra na árvore de cena, seu _ready() imprime Laser attached.
  • Robot estende Node. add_part(part_name, power) adiciona uma nova Part como filha. Se o robô já tiver uma filha com esse nome, ele imprime Laser is already attached e não cria nada.
  • total_power() retorna a soma da potência de todas as suas peças.

O código fornecido adiciona o robô à árvore de cena, lê quantos comandos vêm a seguir (add Laser 5, power) e imprime o número de peças no final. Para add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power, ele imprime:

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

Seu código deve ficar em part.gd e robot.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online