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.
Sfida
FacileScrivi una Bomb che esegue un conto alla rovescia e annuncia ogni passaggio con dei segnali.
- Dichiara due segnali:
beepedeexploded. tick()diminuiscefusedi1. Se la miccia è ancora maggiore di0, emettibeeped; se ha raggiunto0, emettiexploded.- 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: 0Inserisci 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!")
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