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.
Desafío
FácilEscribe una Bomb que cuente hacia atrás y anuncie cada paso con señales.
- Declara dos señales:
beepedyexploded. tick()reducefuseen1. Si la mecha sigue por encima de0, emitebeeped; si ha llegado a0, emiteexploded.- 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: 0Tu 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!")
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
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online