属性
本课属于 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。
挑战
简单在 player.gd 中完成 Player 类。声明以下属性:
player_name,一个初始值为"Hero"的Stringlevel,一个初始值为1的inthp,一个初始值为100的intinventory,一个初始为空的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())
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器