Signaux avec arguments
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 38 sur 65.
Un signal peut transporter des valeurs. Indique-les dans la déclaration, comme les paramètres d’une fonction :
signal damaged(amount: int, hp_left: int)
signal diedTransmets les valeurs à emit() dans le même ordre :
func take_damage(amount: int) -> void:
hp = maxi(hp - amount, 0)
damaged.emit(amount, hp)
if hp == 0:
died.emit()Une fonction connectée reçoit les valeurs en tant que paramètres. Elle a donc besoin d’un paramètre par valeur :
hero.damaged.connect(_on_hero_damaged)
func _on_hero_damaged(amount: int, hp_left: int) -> void:
print("-%d HP, %d left" % [amount, hp_left])Les types dans la déclaration documentent les valeurs : GDScript ne les vérifie pas lors de l’émission. Une incompatibilité apparaît dans la fonction réceptrice. Une fonction qui n’a pas le bon nombre de paramètres, ou un paramètre typé qui ne peut pas contenir la valeur, provoque une erreur à la ligne emit(), et cette fonction ne s’exécute pas.
bind() ajoute vos propres valeurs après celles émises. Une méthode peut alors écouter plusieurs héros tout en sachant lequel a été touché :
ada.damaged.connect(_on_damaged.bind("Ada"))
bo.damaged.connect(_on_damaged.bind("Bo"))
func _on_damaged(amount: int, hp_left: int, who: String) -> void:
print(who, " lost ", amount, " HP")Les arguments fournissent à un écouteur les données dont il a besoin, afin qu’il n’ait pas à les lire depuis l’émetteur. Ne connectez jamais une lambda qui utilise l’objet émetteur lui-même, comme hero.died.connect(func(): print(hero.hp)) : la lambda maintient hero en vie, hero maintient la lambda, aucun des deux n’est jamais libéré, et Godot signale des instances ayant fui lorsque le programme se termine.
Défi
FacileUn portefeuille signale chaque changement au moyen de signaux qui transportent les nombres. Dans Wallet, ajoute les paramètres aux deux signaux et écris les deux méthodes :
balance_changed(old_balance: int, new_balance: int)etpurchase_failed(price: int, missing: int)add(amount)ajoute des pièces et émetbalance_changedavec le solde avant et après.buy(price): lorsque le solde est suffisant, soustrais le prix et émetsbalance_changed. Sinon, ne change rien et émetspurchase_failedavec le prix et le nombre de pièces manquantes.
Le code fourni connecte une fonction à chaque signal, lit le nombre de commandes à suivre, exécute chaque commande (add 20, buy 15) et affiche les pièces restantes à la fin. Pour add 20, buy 15, buy 10, add 5, buy 10, il affiche :
Balance: 0 -> 20
Balance: 20 -> 5
Cannot buy for 10: 5 coins missing
Balance: 5 -> 10
Balance: 10 -> 0
Coins left: 0Ton code va dans wallet.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 wallet := Wallet.new()
wallet.balance_changed.connect(_on_balance_changed)
wallet.purchase_failed.connect(_on_purchase_failed)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
wallet.add(int(parts[1]))
else:
wallet.buy(int(parts[1]))
print("Coins left: ", wallet.balance)
func _on_balance_changed(old_balance: int, new_balance: int) -> void:
print("Balance: %d -> %d" % [old_balance, new_balance])
func _on_purchase_failed(price: int, missing: int) -> void:
print("Cannot buy for %d: %d coins missing" % [price, missing])
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