> 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
内容如有错误欢迎指出