Menu
CoddyTech

Сеттеры свойств

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 11 из 65.

Свойство может выполнять код каждый раз, когда ему присваивается значение. Поставь двоеточие после объявления и добавь блок set(value): с отступом — его сеттер:

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

value — это то, что присваивается. Внутри сеттера присваивание значения health сохраняет его в свойстве; сеттер не запускается повторно. Этот сеттер поддерживает значение health в диапазоне от 0 до 100, независимо от того, какое значение присваивает остальная часть программы:

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

Сеттер выполняется при каждом присваивании, в том числе внутри класса: health -= 10 в методе Player и health = start_health в _init() проходят через него. Только начальное значение после = в объявлении сохраняется без его вызова.

Сеттер также может отклонить значение. Если он не присваивает свойству значение, сохраняется старое значение:

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

Не указывай тип для value: set(value: int): — это ошибка. Тип самого свойства уже указывает, что оно хранит.

challenge icon

Задание

Легко

Добавь свойство health класса Player в файле player.gd сеттер, который:

  • поддерживает сохранённое значение здоровья в диапазоне от 0 до max_health: большее значение сохраняется как max_health, а отрицательное — как 0
  • выводит Player is down!, когда новое значение здоровья равно 0, а старое было больше 0

Предоставленный код считывает количество команд, а затем по одной команде в каждой строке: damage N (player.health -= N), heal N (player.health += N) или set N (player.health = N). После каждой команды он выводит значение здоровья. Для команд damage 30, heal 50, damage 120 и heal 10 он выводит:

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

Твой код должен находиться в файле player.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений
	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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript