Menu
CoddyTech

属性

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

类声明的变量就是它的属性(也称为成员变量):每个对象都携带的数据。在类的顶部声明它们,并为每个变量指定类型和初始值:

# player.gd
class_name Player
extends RefCounted

var player_name: String = "Hero"
var level: int = 1
var hp: float = 100.0
var inventory: Array[String] = []

未指定值的属性会从其类型的默认值开始:int 的默认值是 0,String 的默认值是 "",bool 的默认值是 false,而 Array[String] 的默认值是空数组。

在类的外部,你使用点号读取和修改属性。在类的方法内部,你使用属性名:

var p := Player.new()
p.level += 1
p.inventory.append("sword")
print(p.level) # 2
print(p.inventory) # ["sword"]

每个对象都有自己的每个属性副本,包括数组:[] 会为每个玩家创建一个新的空数组,因此其他玩家的物品栏仍然是空的。

类型会经过检查:p.level = "max" 会在程序运行前报告错误,因为 level 保存的是 int。

challenge icon

挑战

简单

在 player.gd 中完成 Player 类。声明以下属性:

  • player_name,一个初始值为 "Hero" 的 String
  • level,一个初始值为 1 的 int
  • hp,一个初始值为 100 的 int
  • inventory,一个初始为空的 Array[String]

然后完成 describe() 方法。它会返回 NAME (level LEVEL, HP hp): ITEMS,其中 ITEMS 是用 ", " 连接后的库存内容;如果库存为空,则返回 no items。

提供的代码会读取一名玩家的名字,然后读取后续命令的数量,再读取这些命令:hit AMOUNT、item NAME 或 level。代码会直接修改该玩家的属性,最后打印该玩家和另一名从未被修改过的玩家的 describe() 返回值。对于 Ada 以及命令 hit 30、item sword、level 和 item shield,输出为:

Ada (level 2, 70 hp): sword, shield
Hero (level 1, 100 hp): no items

将代码写在 player.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。

亲手试试

extends Node

func _ready():
	# 提供的输入输出代码:保持原样。
	var hero := Player.new()
	hero.player_name = OS.read_string_from_stdin()
	var guest := Player.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		match parts[0]:
			"hit":
				hero.hp -= int(parts[1])
			"item":
				hero.inventory.append(parts[1])
			"level":
				hero.level += 1
	print(hero.describe())
	print(guest.describe())
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: GDScript 在线编译器