【GDScript】保存/加载物品装备数据

> Godot 3.3 rc6

接着上个文章 【Godot】加载文件数据

我们开始给装备栏和物品栏制作保存数据的功能。(文末有文件项目链接)

我们在 FileManager.gd 脚本里添加如下代码,用来保存加载数据

## 文件是否存在
## @path 文件路径
func exists_file(path: String) -> bool:
	var file = File.new()
	var exists = file.file_exists(path)
	file.close()
	return exists


## 保存数据
## @path 文件路径
## @data 数据
func save_data(path: String, data) -> void:
	var file = File.new()
	file.open(path, File.WRITE)
	file.store_var(data)	# 写入数据
	file.close()


## 加载数据
## @path 文件路径
## @return 返回数据
func load_data(path: String):
	var file = File.new()
	file.open(path, File.READ)
	var data = file.get_var()	# 读取数据
	file.close()
	return data

打开 Inventory.tscn 场景,Inventory.gd 脚本的 _ready 方法删除不要了,脚本里再添加 设置物品数据获取物品数据 的方法,代码如下:

#------------------------------
#  Set/Get
#------------------------------
## 设置物品数据列表
func set_goods_data_list(data_list: Array) -> void:
	for data in data_list:
		var goods_property = GoodsProperty.new()
		goods_property.set_property(data)
		
		var goods = ScnGoods.instance()
		goods.set_goods_property(goods_property)
		grid.add_child(goods)


## 返回物品数据列表
func get_goods_data_list() -> Array:
	var data_list = []
	for goods in grid.get_children():
		var goods_property = goods.goods_property	# 物品资源属性
		# 如果物品的资源属性不为 null
		if goods_property:
			var goods_data = goods_property.get_property()	# 属性数据
			# 添加到 data_list 数组中
			data_list.push_back(goods_data)
	return data_list


#------------------------------
#  自定义方法
#------------------------------
## 添加一个空物品
func add_empty_goods():
	var goods = ScnGoods.instance()
	grid.add_child(goods)

打开 EquipmentPanel.tscn 场景,给 EquipmentPanel.gd 脚本添加如下代码:


#------------------------------
#  Set/Get
#------------------------------
func set_data_list(data_list: Array):
	for data in data_list:
		# 获取是哪个节点上的物品
		var node_name = data['id']
		var goods = get_node(node_name) as Goods
		
		# 设置物品资源属性
		var goods_property = GoodsProperty.new()
		goods_property.set_property(data)
		
		# 设置属性到物品上
		goods.set_goods_property(goods_property)
		
		# 装备属性发生改变
		change_property(goods_property, true)


func get_data_list() -> Array:
	var data_list = []
	# 获取物品的属性
	for goods in get_children():
		var goods_property = goods.goods_property as GoodsProperty
		if goods_property:
			var data = goods_property.get_property()
			# 记录是哪个节点,以节点名作为 id
			data['id'] = goods.name
			# 添加到 data_list 数组中
			data_list.push_back(data)
	return data_list

打开 Test.tscn 场景,给 Test.gd 脚本添加如下代码

# 存放数据的路径
const DataPath = "res://data/"
# 物品数据路径
const InventoryDataPath = DataPath + "InventoryGoodsData"
# 装备物品路径
const EquipmentDataPath = DataPath + "EquipmentGoodsData"
# 属性列表
const PropertyList = preload("res://inventory/GoodsProperty.gd").GoodsProperty

onready var equip_panel = $HBoxContainer/EquipmentPanel
onready var inventory = $HBoxContainer/VBoxContainer/Inventory


#------------------------------
#  节点带有的方法
#------------------------------
func _ready() -> void:
	property_label.text = format_data_to_text(equip_panel.all_property)
	
	load_inventory_data()
	load_equipment_data()

	## 添加几个空物品,装备栏有几个物品,物品栏添加几个空物品
	for i in range(equip_panel.get_data_list().size()):
		inventory.add_empty_goods()



#------------------------------
#  自定义方法
#------------------------------
## 加载物品数据
func load_inventory_data():
	# 如果有数据,则加载数据
	if FileManager.exists_file(InventoryDataPath):
		# 加载文件数据
		var data_list = FileManager.load_data(InventoryDataPath)
		# 图片数据无法保存,所以需要重新通过名称获取物品的图片
		for data in data_list:
			data[PropertyList.Texture] = GoodsFactory.get_goods_data(data[PropertyList.Name])[PropertyList.Texture]
		# 设置物品栏物品的数据
		inventory.set_goods_data_list(data_list)
		
	# 没有数据,则添加几个物品
	else:
		inventory.add_goods("金疮药")
		inventory.add_goods("桃木剑")
		inventory.add_goods("生锈铁剑")


## 加载装备栏数据
func load_equipment_data():
	# 如果有数据,则加载数据
	if FileManager.exists_file(EquipmentDataPath):
		var data_list = FileManager.load_data(EquipmentDataPath)
		# 图片数据无法保存,所以需要重新通过名称获取物品的图片
		for data in data_list:
			data[PropertyList.Texture] = GoodsFactory.get_goods_data(data[PropertyList.Name])[PropertyList.Texture]
		
		equip_panel.set_data_list(data_list)

点击根节点 Test 节点,连接 tree_exited 信号到 Test 节点上
在这里插入图片描述
在这里插入图片描述
连接后方法的代码如下:

func _on_Test_tree_exited():
	## 获取物品栏的数据并保存
	var inv_data_list = inventory.get_goods_data_list()
	FileManager.save_data(InventoryDataPath, inv_data_list)
	
	## 获取装备栏的数据并保存
	var equ_data_list = equip_panel.get_data_list()
	FileManager.save_data(EquipmentDataPath, equ_data_list)

进入 Test.tscn 场景按 F6 测试一下
在这里插入图片描述


项目文件:

百度网盘链接: https://pan.baidu.com/s/1YGjx-2pkGEwTKSX0HJVNeg

提取码: 4p9v


内容如有错误欢迎指出

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值