Declarando e emitindo
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 36 de 65.
Declare um sinal com a palavra-chave signal e um nome, no início da classe, junto às variáveis. O nome de um sinal descreve um evento que já aconteceu, em snake_case: died, door_opened, leveled_up. Uma classe declara quantos sinais forem necessários:
# player.gd
class_name Player
extends RefCounted
signal leveled_up
signal max_level_reached
const MAX_LEVEL := 3
var level := 1
var xp := 0
func add_xp(amount: int) -> void:
xp += amount
while xp >= 100 and level < MAX_LEVEL:
xp -= 100
level += 1
leveled_up.emit()
if level == MAX_LEVEL:
max_level_reached.emit()Emita um sinal no momento em que o evento acontece, e somente então. add_xp(50) em um jogador novo não emite nada. add_xp(250) depois faz xp chegar a 300: leveled_up é emitido duas vezes, uma vez por nível ganho, e max_level_reached uma vez, ao subir de nível e chegar ao nível 3.
Um setter de propriedade é um bom lugar para emitir, porque o sinal então é disparado por qualquer código que altere o valor:
signal died
var hp: int = 10:
set(value):
var was_alive := hp > 0
hp = maxi(value, 0)
if was_alive and hp == 0:
died.emit()was_alive impede que died seja emitido novamente quando um herói com 0 HP é atingido mais uma vez.
Um sinal também pode ser acessado pelo nome como texto: emit_signal("died") o emite, hero.connect("died", _on_hero_died) conecta-se a ele, e hero.has_signal("died") retorna true. Conectar-se a um nome que o objeto não declara é um erro quando essa linha é executada.
Desafio
FácilEscreva uma Bomb que faça uma contagem regressiva e anuncie cada etapa com sinais.
- Declare dois sinais:
beepedeexploded. tick()diminuifuseem1. Se o pavio ainda estiver acima de0, emitabeeped; se tiver chegado a0, emitaexploded.- Quando o pavio estiver em
0, a bomba terá explodido: os ticks seguintes não fazem nada e não emitem nada.
O código fornecido lê o pavio inicial e quantos ticks executar, conecta-se aos dois sinais pelo nome e imprime Beep e BOOM! a partir das funções conectadas e, em seguida, o pavio restante. Para um pavio de 3 e 5 ticks, ele imprime:
Beep
Beep
BOOM!
Fuse: 0Seu código deve ficar em bomb.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 bomb := Bomb.new(int(OS.read_string_from_stdin()))
# connect() com o nome do sinal em forma de texto
bomb.connect("beeped", _on_beeped)
bomb.connect("exploded", _on_exploded)
var ticks := int(OS.read_string_from_stdin())
for i in ticks:
bomb.tick()
print("Fuse: ", bomb.fuse)
func _on_beeped() -> void:
print("Beep")
func _on_exploded() -> void:
print("BOOM!")
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