Se connecter aux signaux
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 37 sur 65.
connect() prend la fonction à exécuter, sous la forme d’un Callable. Indique un nom de méthode sans parenthèses, ou écris une fonction lambda :
chest.opened.connect(_on_chest_opened) # une méthode de ce script
chest.opened.connect(quest_log.add_entry) # une méthode d'un autre objet
chest.opened.connect(func(): print("Creak!")) # une fonction lambdaGodot nomme une méthode d’écoute _on_, puis l’émetteur, puis le signal : _on_chest_opened. Un signal peut avoir plusieurs fonctions connectées, qui s’exécutent dans l’ordre où elles ont été connectées.
Un objet qui écoute se connecte généralement lui-même dans une méthode qui reçoit l’émetteur :
# quest_log.gd
class_name QuestLog
extends RefCounted
var chests_opened := 0
func track(chest: Chest) -> void:
if not chest.opened.is_connected(_on_chest_opened):
chest.opened.connect(_on_chest_opened)
func untrack(chest: Chest) -> void:
if chest.opened.is_connected(_on_chest_opened):
chest.opened.disconnect(_on_chest_opened)
func _on_chest_opened() -> void:
chests_opened += 1Connecter deux fois la même fonction au même signal est une erreur, tout comme déconnecter une fonction qui n’est pas connectée. is_connected() vérifie d’abord. disconnect() cesse l’écoute, et le prochain signal émis n’exécute plus cette fonction.
Transmets CONNECT_ONE_SHOT comme deuxième argument et la connexion se supprime après son premier appel : chest.opened.connect(_on_first_open, CONNECT_ONE_SHOT).
Une lambda conserve la valeur qu’avait une variable locale au moment de sa création. count += 1 dans une lambda connectée modifie cette copie, et count dans _ready() reste à 0. Conserve un compteur dans une variable membre d’un objet écouteur, comme le fait QuestLog.
Défi
FacileUn champ de tir comporte des cibles qui émettent hit lorsqu'on leur tire dessus. Écris le ScoreBoard qui les écoute :
watch(target)connecte le signalhitde la cible à_on_target_hit. Observer une cible déjà observée ne change rien.ignore(target)déconnecte la cible. Ignorer une cible qui n'est pas observée ne change rien._on_target_hit()ajoute10àpointset afficheHit! Score: N.
Observer deux fois une cible ou ignorer une cible qui n'est pas observée ne doit pas provoquer d'erreur, car toute erreur fait échouer le test. target.gd est complet.
Le code fourni lit le nombre de cibles, puis des commandes telles que watch 0, ignore 0 et shoot 0, puis affiche le score final. Pour deux cibles et les commandes watch 0, shoot 0, shoot 1, watch 1, watch 1, shoot 1, ignore 0, shoot 0, il affiche :
Shot target 0
Hit! Score: 10
Shot target 1
Shot target 1
Hit! Score: 20
Shot target 0
Final score: 20Ton code va dans score_board.gd et target.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 : ne le modifiez pas
var board := ScoreBoard.new()
var targets: Array[Target] = []
for i in int(OS.read_string_from_stdin()):
targets.append(Target.new())
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var target := targets[int(parts[1])]
if parts[0] == "watch":
board.watch(target)
elif parts[0] == "ignore":
board.ignore(target)
else:
print("Shot target ", parts[1])
target.shoot()
print("Final score: ", board.points)
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