Menu
CoddyTech

回顾:健康系统

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 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 达到 0 时,还会发出 died 信号。
  • heal(amount) 会提高 hp,但不会超过 max_hp,并发出 healed 信号,其中包含实际恢复的生命值和新的 hp。生命值已满时进行治疗不会发出任何信号。
  • hp 为 0 后,这两个方法都不会执行任何操作。

HealthBar(health_bar.gd)包含 watch(health),用于将全部三个信号连接到它自己的方法。这些方法会打印 -8 HP [12/20]、+5 HP [17/20] 和 Game over。生命值条会将所需的最大生命值存为一个数字,不要保留对 Health 对象的引用。

提供的代码会读取最大生命值和后续命令的数量(damage 8、heal 5),然后打印最终生命值。最大生命值为 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 在线编译器