Qu’est-ce qu’un signal ?
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 35 sur 65.
Des choses arrivent aux objets pendant qu’un jeu s’exécute : une pièce est ramassée, une porte s’ouvre, les hp du héros tombent à 0. D’autres parties du programme réagissent à ces événements : le score augmente, un son est joué, l’écran de fin de partie apparaît.
Un signal est un message qu’un objet envoie lorsqu’il lui arrive quelque chose. L’objet émet le signal, et chaque fonction connectée à ce signal s’exécute :
# coin.gd
class_name Coin
extends RefCounted
signal collected
func collect() -> void:
print("Coin picked up")
collected.emit()signal collected déclare le signal et collected.emit() l’envoie. La pièce ne sait pas qui l’écoute. Le code qui s’intéresse aux pièces connecte l’une de ses propres fonctions au signal :
# 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")La sortie est Coin picked up, Score +1, Done. L’émission exécute immédiatement les fonctions connectées, avant la ligne qui suit emit(). Un signal sans fonction connectée ne fait rien lorsqu’il est émis.
Sans signal, collect() devrait appeler lui-même le code du score, donc chaque pièce devrait avoir une référence au tableau des scores. Avec un signal, la pièce annonce simplement l’événement, et n’importe quel nombre d’écouteurs, ou aucun, peut y réagir.
Les propres nœuds de Godot fonctionnent de la même manière : un Button émet pressed lorsqu’on clique dessus, et un Timer émet timeout lorsque son délai expire.
Défi
FacileUne boîte aux lettres annonce l’arrivée de nouveaux courriers à l’aide d’un signal. Mailbox déclare déjà signal mail_arrived et possède un compteur letters. Écrivez deliver(kind) :
- Lorsque
kindvaut"letter", ajoutez1àletterset émettezmail_arrived. - Tout autre type (une publicité, un prospectus) est jeté : rien ne change et aucun signal n’est émis.
Le code fourni connecte une fonction qui affiche You've got mail!, puis lit le nombre de lignes suivantes et traite chacune d’elles. La ligne away déconnecte cette fonction et home la connecte à nouveau ; ainsi, une lettre qui arrive pendant votre absence est comptabilisée, mais n’est pas annoncée. Pour les lignes letter, ad, away, letter, le programme affiche :
Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2Votre code va dans mailbox.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d’entrée/sortie fourni : conservez-le tel quel
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!")
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne