【GDScript】保存/加载物品装备数据
生活随笔
收集整理的這篇文章主要介紹了
【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 節點上
連接后方法的代碼如下:
進入 Test.tscn 場景按 F6 測試一下
項目文件:
百度網盤鏈接: https://pan.baidu.com/s/1YGjx-2pkGEwTKSX0HJVNeg
提取碼: 4p9v
內容如有錯誤歡迎指出
總結
以上是生活随笔為你收集整理的【GDScript】保存/加载物品装备数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命名空间cgroups简介
- 下一篇: VUE路由防卫功能举例