日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】保存/加载物品装备数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。