Menu
CoddyTech

Повторение — система здоровья

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

challenge icon

Задание

Легко

Создай систему здоровья, в которой компонент здоровья сообщает о каждом изменении, а индикатор здоровья реагирует на него.

Health (health.gd) хранит max_hp и hp (оба изначально равны значению, переданному конструктору) и объявляет три сигнала: damaged(amount, hp), healed(amount, hp) и died.

  • take_damage(amount) уменьшает hp, не опуская его ниже 0, и отправляет сигнал damaged с фактически потерянным количеством HP и новым значением hp. Когда hp достигает 0, также отправляется сигнал died.
  • heal(amount) увеличивает hp, не превышая max_hp, и отправляет сигнал healed с фактически восстановленным количеством HP и новым значением hp. При полном здоровье восстановление ничего не отправляет.
  • Если hp равно 0, оба метода ничего не делают.

HealthBar (health_bar.gd) содержит метод watch(health), который подключает все три сигнала к собственным методам. Они выводят -8 HP [12/20], +5 HP [17/20] и Game over. Индикатор хранит максимальное количество HP, которое ему нужно, как число; не сохраняй ссылку на объект Health.

Предоставленный код считывает максимальное количество HP и число следующих команд (damage 8, heal 5), а затем выводит итоговое количество HP. Для максимума 20 и команд damage 8, heal 5, heal 10, damage 30, heal 5 он выводит:

-8 HP [12/20]
+5 HP [17/20]
+3 HP [20/20]
-20 HP [0/20]
Game over
Final HP: 0

Твой код нужно поместить в health.gd и health_bar.gd. Файл main.gd содержит предоставленный код ввода/вывода, и его нельзя редактировать.

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

extends Node

func _ready():
	# Предоставленный код ввода/вывода: оставьте его без изменений
	var health := Health.new(int(OS.read_string_from_stdin()))
	var bar := HealthBar.new()
	bar.watch(health)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "damage":
			health.take_damage(int(parts[1]))
		elif parts[0] == "heal":
			health.heal(int(parts[1]))
	print("Final HP: ", health.hp)

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

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