Menu
CoddyTech

Setter delle proprietà

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 11 di 65.

Una proprietà può eseguire del codice ogni volta che le viene assegnato un valore. Metti i due punti dopo la dichiarazione e aggiungi un blocco set(value): indentato, il suo setter:

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

value è ciò che viene assegnato. All'interno del setter, assegnare health memorizza il valore nella proprietà; non esegue di nuovo il setter. Questo setter mantiene health tra 0 e 100, qualunque cosa assegni il resto del programma:

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

Il setter viene eseguito a ogni assegnazione, anche all'interno della classe: health -= 10 in un metodo di Player e health = start_health in _init() passano entrambi da esso. Solo il valore iniziale dopo = nella dichiarazione viene memorizzato senza chiamarlo.

Un setter può anche rifiutare un valore. Se non assegna la proprietà, il valore precedente rimane:

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

Ometti il tipo di value: set(value: int): è un errore. Il tipo della proprietà indica già cosa contiene.

challenge icon

Sfida

Facile

Assegna alla proprietà health della classe Player in player.gd un setter che:

  • mantenga la salute memorizzata tra 0 e max_health: un valore maggiore viene memorizzato come max_health e uno negativo come 0
  • stampi Player is down! quando la nuova salute è 0 e la vecchia salute era superiore a 0

Il codice fornito legge quanti comandi seguono, poi ne legge uno per riga: damage N (player.health -= N), heal N (player.health += N) o set N (player.health = N). Dopo ogni comando stampa la salute. Per damage 30, heal 50, damage 120 e heal 10 stampa:

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

Il tuo codice va in player.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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 iconMettiti alla prova

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

Esercitati da solo: Compilatore GDScript online