關于Defold動態(tài)加載圖片
拿到一張圖片(PNG),想要顯示出來,可以讓GUI Node顯示,或者讓Sprite顯示。
GUI Node顯示:將圖片文件加載為紋理。先用sys.load_resource()將圖片文件轉換成String,然后用image.load將圖片String轉換為圖片Lua表,最后用gui.new_texture()將圖片Lua表轉換為GUI紋理。把紋理綁定在GUI Node上,完成顯示。
需要注意,GUI Node恒定遮擋游戲世界的元素。因此如果你的游戲不是100%用GUI Node實現的話,按這個方法就不能實現“封面鋪底”一類的效果。
Sprite顯示 法一
首先,想個辦法讓你的圖片資源能出現在磁盤上。對于玩家導入曲目的音游,好說;對于制作方收錄曲子的音游,設為Bundle Resource(可以自己實現一個壓縮再解壓/加密再解密什么的,也可以源文件存儲)。
然后,用Lua io庫打開文件,再用Defold-PNG原生擴展將打開的PNG文件轉換成材質Buffer,另外手搓一個材質的header。
最后直接用resource.set_texture()把目標Sprite的材質改掉。
Sprite顯示 法二
轉變思路:Sprite原生只支持Atlas,那就嘗試把圖片轉換成Atlas資源。轉換比較簡單,用Defold的編輯器創(chuàng)建一個Atlas,再加入我們的PNG圖片即可。
第一反應是把Atlas文件存到Custom Resource中,然后嘗試用sys.load_resource()的加載結果作為Sprite的image屬性;或者直接上go.property("my_image",resource.atlas(path))再借助self userdata取得"my_image"屬性的值,認為這個值是指向成品圖集的hash,設置為Sprite的image屬性。
這一堆都是不可行的。因為Custom Resource最終是原樣打包不帶任何檢測,而編輯器產生的xxx.atlas文件并不是成品圖集,僅僅是一個配置文件。。。。。。。
因此必須讓最終可能加載的Atlas都進入靜態(tài)資源樹內,使其在打包時被轉換為成品圖集。這里有一計:
A. 準備index_01.go,index_02.go之類的Game Object文件,這些Game Object下的組件是各個Sprite,將它們的image屬性設置成最終需要加載的Atlas;
B. 準備一個index.collection,集合內對每一個index_**.go添加一個Factory,這些Factory全部設為Load Dynamically(其實我們根本不打算讓index.collection下面的Factory創(chuàng)建index_**.go的實例)
C. 將這個index.collection扔到啟動集合內。
再之后,用resource.atlas()加載的Atlas就是成品圖集了。用go.property()載入Atlas,然后把Atlas的Hash轉移到目標Sprite的image屬性,最后用sprite.play_flipbook()使設定的圖片可以顯示出來。
go.property(id,value)的value可以是一個提前建好的全局變量,這樣Atlas的載入就動態(tài)起來了。
下次講講Defold的腳本文件加載。
