Menu
CoddyTech

Dichiarare ed emettere

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 36 di 65.

Dichiara un segnale con la parola chiave signal e un nome, all’inizio della classe accanto alle sue variabili. Il nome di un segnale descrive un evento già accaduto, in snake_case: died, door_opened, leveled_up. Una classe dichiara tutti i segnali di cui ha bisogno:

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

Emetti un segnale nel momento in cui si verifica il relativo evento, e solo allora. add_xp(50) su un nuovo giocatore non emette nulla. add_xp(250) dopo aver portato xp a 300: leveled_up viene emesso due volte, una per ogni livello guadagnato, e max_level_reached una volta, quando si sale al livello 3.

Un setter di proprietà è un buon posto in cui emettere il segnale, perché il segnale viene attivato da qualsiasi codice modifichi il valore:

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 impedisce che died venga emesso di nuovo quando un eroe con 0 HP viene colpito ancora una volta.

È possibile accedere a un segnale anche tramite il suo nome come testo: emit_signal("died") lo emette, hero.connect("died", _on_hero_died) vi si collega e hero.has_signal("died") restituisce true. Collegarsi a un nome che l'oggetto non dichiara genera un errore quando viene eseguita quella riga.

challenge icon

Sfida

Facile

Scrivi una Bomb che esegue un conto alla rovescia e annuncia ogni passaggio con dei segnali.

  • Dichiara due segnali: beeped e exploded.
  • tick() diminuisce fuse di 1. Se la miccia è ancora maggiore di 0, emetti beeped; se ha raggiunto 0, emetti exploded.
  • Una volta che la miccia è 0, la bomba è esplosa: i tick successivi non fanno nulla e non emettono nulla.

Il codice fornito legge la miccia iniziale e il numero di tick da eseguire, si connette a entrambi i segnali per nome e stampa Beep e BOOM! dalle funzioni connesse, poi stampa la miccia rimanente. Per una miccia di 3 e 5 tick, stampa:

Beep
Beep
BOOM!
Fuse: 0

Inserisci il tuo codice in bomb.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online