Сеттеры свойств
Часть раздела Объектно-ориентированное программирование путешествия по 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): — это ошибка. Тип самого свойства уже указывает, что оно хранит.
Задание
ЛегкоДобавь свойство 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)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript