【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 # 物品资源属性# 如果物品的资源属性不为 nullif 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 GoodsPropertyif goods_property:var data = goods_property.get_property()# 记录是哪个节点,以节点名作为 iddata['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").GoodsPropertyonready 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
内容如有错误欢迎指出
【GDScript】保存/加载物品装备数据相关推荐
- PyTorch模型的保存加载以及数据的可视化
文章目录 PyTorch模型的保存和加载 模块和张量的序列化和反序列化 模块状态字典的保存和载入 PyTorch数据的可视化 TensorBoard的使用 总结 PyTorch模型的保存和加载 在深度 ...
- (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
文章目录 一.点击过的新闻列表文字变灰 效果图 实现思路 导入ormlite数据库类依赖 利用ormlite创建数据库和表 创建数据库类MyDbHelper 创建数据库中的新闻实体类NewInfo 页 ...
- Geospark-SQL加载SHP数据
title: (六)Geospark SQL加载SHP数据(JAVA版) date: 2021-05-08 09:29:06 tags: GeoSpark GeoSpark SQL默认是无法读取Shp ...
- c++读取图片_Pytorch读取,加载图像数据(一)
Pytorch读取,加载图像数据(一) 在学习Pytorch的时候,先学会如何正确创建或者加载数据,至关重要. 有了数据,很多函数,操作的效果就变得很直观. 本文主要用其他库读取图像文件(学会这个,你 ...
- 上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...
现在是一次性加载所有的记录数据,数据多的时候,会加载比较慢,所以我们改成分页加载,一次最多加载15条数据 每次拉倒底部都会自动加载下一页的数据,知道所有的数据加载完成 1.添加data变量 编辑rec ...
- android预加载app,Android欢迎页预加载首页数据
项目需求:展示欢迎页的同时执行token登录和首页预加载 背景: 在此之前,展示欢迎页和token登录等网络操作是串行的,所以用户点开App到最终看到首页的时间就是:"展示欢迎页的时间&qu ...
- C++-加载EXCEL数据
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 在用C++编程时,有保存数据的需求就有加载数据的需求,加载EXCEL数据的方式各式各样 ...
- Matlab停在载入界面,试图在Matlab用户界面中实现保存/加载对象功能时遇到了困难...
我尝试在Matlab(R2009A)用户界面中实现保存/加载函数.我的对象实现了一个布局函数,它为对象生成一个用户界面.我正在尝试实现保存/加载按钮的回调."保存"按钮起作用,并将 ...
- 216:vue+openlayers 加载GPX数据,导出geojson文件
第216个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载GPX数据,显示图形, 导出geojson文件. GPX(GPS eXchange Format,GPS交换 ...
最新文章
- TabLayout 在宽屏幕上tab不能平均分配的问题解决
- [转]Docker 大势已去,Podman 即将崛起
- JPA 2 | 动态查询与命名查询
- gd动态曲线 php_php中用GD绘制折线图
- Linux初级运维(十七)——Linux内核编译与系统裁减
- [LeetCode] 118. Pascal's Triangle Java
- php upload 缓存_php-使用vich_uploader的liip_imagine无法创建缓存
- 20200907:力扣203周周赛题解记录
- git clone 某一特定分支转
- Centos如何安装163yum源
- IplImage结构及与其相关的读写函数
- 幼儿抽象逻辑思维举例_四个锻炼幼儿推理能力的小游戏,让孩子的逻辑思维更上一层楼...
- picasa2中文版,picasa2中文,picasa2中文版下载,picasa2中文版本
- 对六自由度机械臂的运动控制及python实现(附源码)
- JavaScript里的var变量
- layuiAdmin 框架单页面文档
- python闭包的应用场景_python闭包浅见
- fast角点与ShiTomas角点速度对比
- 老杜(杜昶旭)GRE填空笔记部分整理-by“ 1哥”+ TTC相关资料
- 上古卷轴5mo初始化python失败_NIF Texcase Fixer Script-适用于Linux的紫色和绝对引用修复程序...