Menu
CoddyTech

Property-Setter

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 11 von 65.

Eine Eigenschaft kann jedes Mal Code ausführen, wenn ihr ein Wert zugewiesen wird. Setze nach der Deklaration einen Doppelpunkt und füge einen eingerückten set(value):-Block hinzu, ihren Setter:

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

value ist das, was zugewiesen wird. Innerhalb des Setters speichert die Zuweisung von health den Wert in der Eigenschaft; sie führt den Setter nicht erneut aus. Dieser Setter hält health zwischen 0 und 100, unabhängig davon, was der Rest des Programms zuweist:

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

Der Setter wird bei jeder Zuweisung ausgeführt, auch innerhalb der Klasse: health -= 10 in einer Methode von Player und health = start_health in _init() laufen beide darüber. Nur der Anfangswert nach = in der Deklaration wird gespeichert, ohne ihn aufzurufen.

Ein Setter kann einen Wert auch ablehnen. Wenn er der Eigenschaft keinen Wert zuweist, bleibt der alte Wert erhalten:

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

Lass den Typ bei value weg: set(value: int): ist ein Fehler. Der Typ der Eigenschaft selbst gibt bereits an, was sie enthält.

challenge icon

Aufgabe

Einfach

Gib der Eigenschaft health der Klasse Player in player.gd einen Setter, der:

  • den gespeicherten Gesundheitswert zwischen 0 und max_health hält: Ein größerer Wert wird als max_health und ein negativer Wert als 0 gespeichert
  • Player is down! ausgibt, wenn der neue Gesundheitswert 0 ist und der alte Gesundheitswert über 0 lag

Der bereitgestellte Code liest ein, wie viele Befehle folgen, dann einen pro Zeile: damage N (player.health -= N), heal N (player.health += N) oder set N (player.health = N). Nach jedem Befehl gibt er den Gesundheitswert aus. Für damage 30, heal 50, damage 120 und heal 10 gibt er Folgendes aus:

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

Dein Code gehört in player.gd. main.gd enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler