Menu
CoddyTech

Settery właściwości

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 11 z 65.

Właściwość może wykonywać kod za każdym razem, gdy zostanie jej przypisana wartość. Po deklaracji wstaw dwukropek i dodaj wcięty blok set(value): — jej setter:

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

value to wartość, która jest przypisywana. Wewnątrz settera przypisanie health zapisuje wartość we właściwości; nie uruchamia ponownie settera. Ten setter utrzymuje health w zakresie od 0 do 100, niezależnie od tego, co przypisuje reszta programu:

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

Setter jest uruchamiany przy każdym przypisaniu, także wewnątrz klasy: health -= 10 w metodzie klasy Player oraz health = start_health w _init() również przez niego przechodzą. Tylko wartość początkowa po = w deklaracji jest zapisywana bez jego wywoływania.

Setter może również odrzucić wartość. Jeśli nie przypisze właściwości, pozostanie stara wartość:

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

Pomiń typ przy value: set(value: int): to błąd. Typ samej właściwości już określa, co przechowuje.

challenge icon

Wyzwanie

Łatwy

Dodaj właściwości health klasy Player w pliku player.gd setter, który:

  • utrzymuje zapisaną wartość zdrowia w zakresie od 0 do max_health: większa wartość jest zapisywana jako max_health, a ujemna jako 0
  • wypisuje Player is down!, gdy nowe zdrowie wynosi 0, a poprzednie było większe od 0

Dostarczony kod odczytuje liczbę kolejnych poleceń, a następnie po jednym w każdym wierszu: damage N (player.health -= N), heal N (player.health += N) lub set N (player.health = N). Po każdym poleceniu wypisuje stan zdrowia. Dla damage 30, heal 50, damage 120 i heal 10 wypisuje:

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

Twój kod umieść w pliku player.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online