Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Escreva uma Bomb que faça uma contagem regressiva e anuncie cada etapa com sinais.

  • Declare dois sinais: beeped e exploded.
  • tick() diminui fuse em 1. Se o pavio ainda estiver acima de 0, emita beeped; se tiver chegado a 0, emita exploded.
  • 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: 0

Seu 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!")
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