Menu
CoddyTech

Declarar y emitir

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 36 de 65.

Declara una señal con la palabra clave signal y un nombre, en la parte superior de la clase junto a sus variables. El nombre de una señal describe un evento que ya ocurrió, en snake_case: died, door_opened, leveled_up. Una clase declara tantas señales como necesite:

# 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()

Emite una señal en el momento en que ocurre su evento, y solo entonces. add_xp(50) en un jugador nuevo no emite nada. add_xp(250) después de que lleva xp a 300: leveled_up se emite dos veces, una por cada nivel obtenido, y max_level_reached una vez, al subir de nivel y alcanzar el nivel 3.

Un setter de propiedad es un buen lugar para emitir la señal, porque así se activa cuando cualquier código cambia el 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 evita que se vuelva a emitir died cuando un héroe con 0 HP recibe otro golpe.

También se puede acceder a una señal mediante su nombre como texto: emit_signal("died") la emite, hero.connect("died", _on_hero_died) se conecta a ella y hero.has_signal("died") devuelve true. Conectarse a un nombre que el objeto no declara es un error cuando se ejecuta esa línea.

challenge icon

Desafío

Fácil

Escribe una Bomb que cuente hacia atrás y anuncie cada paso con señales.

  • Declara dos señales: beeped y exploded.
  • tick() reduce fuse en 1. Si la mecha sigue por encima de 0, emite beeped; si ha llegado a 0, emite exploded.
  • Una vez que la mecha está en 0, la bomba ha explotado: los ticks posteriores no hacen nada ni emiten nada.

El código proporcionado lee la mecha inicial y cuántos ticks debe ejecutar, se conecta a ambas señales por nombre e imprime Beep y BOOM! desde las funciones conectadas; luego imprime la mecha restante. Para una mecha de 3 y 5 ticks, imprime:

Beep
Beep
BOOM!
Fuse: 0

Tu código va en bomb.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	var bomb := Bomb.new(int(OS.read_string_from_stdin()))
	# connect() con el nombre de la señal como 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 iconPonte a prueba

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

Practica por tu cuenta: Compilador de GDScript online