Menu
CoddyTech

属性设置方法

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 11 课,共 65 课。

每次为属性赋值时,都可以运行代码。在声明后加上冒号,并添加一个缩进的 set(value): 代码块,也就是设置器:

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

value 是要赋予的值。在 setter 中,赋值给 health 会将值存储在属性中,不会再次运行 setter。无论程序的其他部分赋予什么值,这个 setter 都会将 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

每次赋值都会调用 setter,在类内部也一样:Player 的方法中的 health -= 10 和 _init() 中的 health = start_health 都会经过它。只有声明中 = 后面的初始值会被直接存储,不会调用它。

setter 也可以拒绝某个值。如果它没有给属性赋值,旧值就会保留:

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

不要给 value 标注类型:set(value: int): 是错误的。属性自身的类型已经说明了它保存的内容。

challenge icon

挑战

简单

为 player.gd 中 Player 类的 health 属性添加一个 setter,使其:

  • 将存储的 health 保持在 0 和 max_health 之间:较大的值存储为 max_health,负值存储为 0
  • 当新的 health 为 0 且旧的 health 大于 0 时,打印 Player is down!

提供的代码会读取后续命令的数量,然后逐行读取命令:damage N(player.health -= N)、heal N(player.health += N)或 set N(player.health = N)。每条命令执行后,代码都会打印 health。对于 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 在线编译器