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()) # 1Um 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.
Desafio
FácilMonte um robô a partir de nós de componentes.
PartestendeNode. Seu construtor recebe um nome de peça e um valor de potência: ele armazena a potência e define onamedo nó como o nome da peça. Quando uma peça entra na árvore de cena, seu_ready()imprimeLaser attached.RobotestendeNode.add_part(part_name, power)adiciona uma novaPartcomo filha. Se o robô já tiver uma filha com esse nome, ele imprimeLaser is already attachede 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: 3Seu 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())
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
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online