Che cos'è un segnale?
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 35 di 65.
Agli oggetti accadono delle cose mentre il gioco è in esecuzione: una moneta viene raccolta, una porta si apre, gli hp dell’eroe scendono a 0. Altre parti del programma reagiscono a questi eventi: il punteggio aumenta, viene riprodotto un suono, appare la schermata di fine partita.
Un segnale è un messaggio che un oggetto invia quando gli accade qualcosa. L’oggetto emette il segnale e ogni funzione collegata a quel segnale viene eseguita:
# coin.gd
class_name Coin
extends RefCounted
signal collected
func collect() -> void:
print("Coin picked up")
collected.emit()signal collected dichiara il segnale e collected.emit() lo invia. La moneta non sa chi è in ascolto. Il codice interessato alle monete collega una delle proprie funzioni al segnale:
# main.gd
func _ready():
var coin := Coin.new()
coin.collected.connect(_on_coin_collected)
coin.collect()
print("Done")
func _on_coin_collected() -> void:
print("Score +1")L'output è Coin picked up, Score +1, Done. L'emissione esegue subito le funzioni collegate, prima della riga successiva a emit(). Un segnale senza funzioni collegate non fa nulla quando viene emesso.
Senza un segnale, collect() dovrebbe chiamare direttamente il codice del punteggio, quindi ogni moneta dovrebbe avere un riferimento al tabellone dei punteggi. Con un segnale, la moneta si limita ad annunciare l'evento e un numero qualsiasi di listener, oppure nessuno, può reagire.
Anche i nodi di Godot funzionano allo stesso modo: un Button emette pressed quando viene cliccato e un Timer emette timeout quando il tempo scade.
Sfida
FacileUna casella postale annuncia la nuova posta con un segnale. Mailbox dichiara già signal mail_arrived e ha un contatore letters. Scrivi deliver(kind):
- Quando
kindè"letter", aggiungi1alettersed emettimail_arrived. - Qualsiasi altro tipo (una pubblicità, un volantino) viene buttato via: non cambia nulla e non viene emesso nulla.
Il codice fornito collega una funzione che stampa You've got mail!, poi legge quante righe seguono e consegna ciascuna di esse. La riga away scollega quella funzione e home la collega di nuovo, quindi una lettera che arriva mentre sei via viene conteggiata, ma non annunciata. Per le righe letter, ad, away, letter stampa:
Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2Inserisci il tuo codice in mailbox.gd. main.gd contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
var mailbox := Mailbox.new()
mailbox.mail_arrived.connect(_on_mail_arrived)
var count := int(OS.read_string_from_stdin())
for i in count:
var line := OS.read_string_from_stdin()
if line == "away":
mailbox.mail_arrived.disconnect(_on_mail_arrived)
elif line == "home":
mailbox.mail_arrived.connect(_on_mail_arrived)
else:
print("Delivering: ", line)
mailbox.deliver(line)
print("Letters: ", mailbox.letters)
func _on_mail_arrived() -> void:
print("You've got mail!")
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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online