【Godot】加载文件数据
Godot 3.3 rc6
接著上個教程 【GDScript】裝備欄
我們開始給物品數據加載出來,之前使用資源的方式是用來加載小量數據的,如果是大量數據,那就不可避免需要加載文件中的數據。
加載數據代碼見上個文章【GDScript】加載 csv 文件,轉化為字典
開始設置文件的數據
保存為 csv 文件,我們保存名稱為 GoodsData.csv
接下來我們在 文件系統 中創建一個 data 文件夾,將文件 GoodsData.csv 放在里面
可以看到這個顯示了 錯誤的圖標,輸出中報錯。這是因為 Godot 不識別這種文件,導入錯誤。
我們在 data 文件夾下創建一個名字為 .gdignore 的文件,Godot 會在導入的時候忽略這個文件夾,創建完我們退出項目,按 Ctrl + Shift + Q 或者選擇菜單 項目-退出到項目列表 退出。我們再重新打開這個項目。
可以看到文件系統中沒有這個文件夾了
我們在 autoload 文件夾中創建一個 GoodsFactory.gd 腳本文件,然后把這個腳本添加到 自動加載 里,用來獲取物品節點
(如果不知道 自動加載 在哪里,看上個文章 【GDScript】加載 csv 文件,轉化為字典 的下半部分內容
打開之前做的 GoodsProperty.gd 腳本,修改 GoodsProperty 的 AttackRange 為 AttackRange,之前一個小失誤
改為
然后我們在 GoodsFactory.gd 腳本里寫入如下內容
## GoodsFactory ## 物品工廠 extends Node## 物品屬性 const GoodsProperty = preload("res://inventory/GoodsProperty.gd") ## 物品場景文件 const ScnGoods = preload("res://inventory/Goods.tscn") ## 物品屬性列表 const GoodsPropertyList = GoodsProperty.GoodsProperty# 存放物品圖片的文件夾(這里我創建了這些路徑) const GoodsPicturePath = "res://assets/texture/goods/"## 物品數據 var goods_data = {}#------------------------------ # 節點帶有的方法 #------------------------------ func _ready():## 獲取物品數據goods_data = FileManager.parse_csv_file("res://data/GoodsData.csv", "Name")#------------------------------ # 自定義方法 #------------------------------ ## 返回一個物品 ## @goods_name 物品名稱 ## @return 返回一個物品的節點 func get_goods(goods_name: String):if goods_data.has(goods_name):var data = get_goods_data(goods_name) # 物品數據var res_property = GoodsProperty.new()## 設置物品屬性資源的屬性數據res_property.set_property(data)## 返回物品節點var goods = ScnGoods.instance()goods.set_goods_property(res_property) # 設置物品屬性return goodselse:print_debug("沒有【%s】這個物品" % goods_name)return null## 返回物品數據 ## -------------- ## 做這個方法的原因是因為,數據的屬性可能與文件的屬性數據不一致的問題 ## 我們在這里將數據轉為 符合物品屬性數據格式 的數據 func get_goods_data(goods_name: String):var data = goods_data[goods_name] # 物品數據var temp = {}# 設置資源的格式:變量[屬性名] = 屬性值temp[GoodsPropertyList.Name] = data['Name']temp[GoodsPropertyList.Damage] = int(data['Damage'])temp[GoodsPropertyList.MoveSpeed] = int(data['MoveSpeed'])temp[GoodsPropertyList.AttackRange] = int(data['AttackRange'])temp[GoodsPropertyList.Price] = int(data['Price'])temp[GoodsPropertyList.Texture] = get_goods_texture(data['Picture'])return temp## 獲取物品圖片 ## @picture_name 物品圖片名稱 ## @return 返回物品的圖片 var file = File.new() func get_goods_texture(picture_name: String) -> Texture:var path = GoodsPicturePath + picture_name + ".png" # 物品圖片路徑# 如果存在圖片,則返回圖片if file.file_exists(path):return load(path) as Texture# 如果不存在,則返回默認的 icon 圖片else:return preload("res://icon.png")現在我們做好的關于 獲取物品 的腳本,在這里我沒有在 res://assets/texture/goods/ 文件夾下邊放圖片,但你如果有圖片文件,你可以修改為和你的 Picture 名稱相同的圖片文件,然后它會自己加載
現在我們開始給 Inventory 增加“添加物品”的功能
打開 Inventory.tscn 場景,添加腳本,寫入如下代碼:
我們再打開之前做的 Goods.tscn 場景,選中 TextureRect 節點,添加腳本,代碼如下:
extends TextureRect## 鼠標指上去顯示數據 func _make_custom_tooltip(for_text):var label = Label.new()var goods_data = get_parent().goods_property.get_property() # 物品數據label.text = JSON.print(goods_data, '\t')return label # 返回這個標簽,顯示數據然后給 TextureRect 節點的 hint_tooltip 屬性添加文字,任何非空格字符串都可以這樣鼠標指上去會調用 _make_custom_tooltip 方法,我給它設置成 111,任何字符都無所謂
我們再切回 Inventory.tscn 場景,按 F6 運行測試一下,鼠標指到物品上,然后顯示出了物品信息:
我是為了省事演示的方式做成這樣,你可以在上面的 Texture 節點的腳本的 _make_custom_tooltip 方法里邊設置自己的標簽然后讓他顯示出來。
可以看到中文字體沒有顯示出來,是因為 Godot 標簽內置的還不支持中文,我們需要手動給他設置中文字體
點擊 Inventory.tscn 場景的 theme 屬性,點擊創建 theme 資源
點擊下邊的 default font ,創建 DynamicFont 資源
在 font_data 屬性里拖拽一個字體文件到里面,下方我會給出項目文件,里面有字體,或者你在 windows 里邊有 Fonts 字體文件夾(自己百度 Fonts 文件夾位置),選擇一個中文字體復制到 Godot 項目的文件夾里,然后設置
然后再按 F6 測試一下場景,這次可以看到有中文字體了
項目文件:
百度網盤鏈接: https://pan.baidu.com/s/1qq9VGfWCrcDplqC-0tZVFw
提取碼: gu6g
文中如有錯誤,歡迎指正。
總結
以上是生活随笔為你收集整理的【Godot】加载文件数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode算法题5:DFS/BFS
- 下一篇: php.c drcom,Drcom (简