Menu
CoddyTech

Setters de propriétés

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 11 sur 65.

Une propriété peut exécuter du code chaque fois qu’on lui assigne une valeur. Ajoute deux-points après la déclaration et un bloc set(value): indenté, son accesseur en écriture :

# player.gd
var health: int = 100:
	set(value):
		health = clampi(value, 0, 100)

value est la valeur qui est assignée. Dans le setter, l’assignation de health stocke la valeur dans la propriété ; elle ne relance pas le setter. Ce setter maintient health entre 0 et 100, quelles que soient les autres valeurs assignées par le reste du programme :

var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0

Le setter s’exécute à chaque affectation, même à l’intérieur de la classe : health -= 10 dans une méthode de Player et health = start_health dans _init() passent tous les deux par lui. Seule la valeur initiale après = dans la déclaration est stockée sans l’appeler.

Un setter peut aussi refuser une valeur. S’il n’assigne pas la propriété, l’ancienne valeur reste :

var level: int = 1:
	set(value):
		if value > level:
			level = value

Omettez le type de value : set(value: int): est une erreur. Le type propre à la propriété indique déjà ce qu’elle contient.

challenge icon

Défi

Facile

Donnez à la propriété health de la classe Player dans player.gd un mutateur qui :

  • maintient la santé stockée entre 0 et max_health : une valeur supérieure est stockée sous la forme max_health et une valeur négative sous la forme 0
  • affiche Player is down! lorsque la nouvelle santé est 0 et que l’ancienne santé était supérieure à 0

Le code fourni lit le nombre de commandes à exécuter, puis les lit une par ligne : damage N (player.health -= N), heal N (player.health += N) ou set N (player.health = N). Après chaque commande, il affiche la santé. Pour damage 30, heal 50, damage 120 et heal 10, il affiche :

Health: 70
Health: 100
Player is down!
Health: 0
Health: 10

Votre code doit se trouver dans player.gd. main.gd contient le code fourni pour les entrées et les sorties 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 player := Player.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var amount := int(parts[1])
		if parts[0] == "damage":
			player.health -= amount
		elif parts[0] == "heal":
			player.health += amount
		elif parts[0] == "set":
			player.health = amount
		print("Health: %d" % player.health)
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne