回顾:健康系统
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 39 课,共 65 课。
挑战
简单构建一个健康系统,让健康组件在每次变化时发出通知,并让生命值条对此做出响应。
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 在线编译器