在starling 1.3版中多增加了許多功能其中一個就是AssetManager。
AssetManager顧名思義就是用來管理素材的class
這邊就來記錄一下要如何使用
1.用Embed素材加入Texture
//先Embed圖片
[Embed(source="assets/bg.jpg")]
public static const BG:Class;
//先實體化AssetManager
vra am:AssetManager = new AssetManager();
//再把圖片加入AssetManager中
//第一個參數是這個texture在AssetManager中所註冊的名字
//第二個參數當然就是要放進AssetManager的texture
am.addTexture("BG", Texture.fromBitmap(new BG()));
//要從AssetManager抓取texture使用的話就使用getTexture方法
//參數就帶當初註冊名字
am.getTexture("BG");
//另外如果想知道所有有註冊的texture的名字可以使用getTextureNames方法
//這個方法會列出所有註冊過的名字
am.getTextureNames();
已經註冊的名字是不能重複註冊的,不然會報Error。
add的方法除了addTexture外還有addSound、addTextureAtlas
其實使用的方法都大同小異只是差在要丟什麼類型素材而已。
2.用enqueue方法加入素材,enqueue方法可以一次塞很多參數進去
也就是一次可以載入很多素材,就像他的名字一樣用列隊的方式依序載入
素材,而且enqueue是很強大的,它除了可以使用檔案路徑之外還可以
使用靜態的類別,甚至是可以搜尋整個資料夾路徑並且分門別類的幫你
自動載入自動註冊(AIR),下面就繼續記錄用不同的參數類型來使用enqueue載入素材。
第一種方法使用路徑載入檔案,使用檔案路徑的方式載入素材時比較要注意的地方是
AssetManager會自動使用檔案的檔名來註冊,例如是載入assets/bg.jpg這個
路徑裡的圖片,就會用bg這個名字來註冊,所以要用getTexture()方法取texture時
也是要用這個名字。
//一樣還是先實體化AssetManager
var am:AssetManager = new AssetManager();
am.enqueue("assets/bg.jpg");
//也可以一次給很多路徑中間用逗號格開就好
am.enqueue("assets/1.jpg","assets/2.jpg","assets/3.jpg");
第二種方法使用靜態類別載入,下面有一個用來embed檔案的靜態類別
package src.embed
{
/**
* ...
* @author kuro
*/
public class EmbedAsset
{
//textureAtlas的圖片
[Embed(source = "assets/lee.png")]
public static const lee:Class;
//textureAtlas的xml
[Embed(source = "assets/leeXml.xml" , mimeType = "application/octet-stream")]
public static const LeeAtlasXml:Class;
//圖片
[Embed(source="assets/bg.jpg")]
public static const BGG:Class;
//聲音
[Embed(source="assets/yours.mp3")]
public static const bgSound:Class;
//字型
[Embed(source="assets/font.png")]
public static const font:Class
[Embed(source="assets/font.fnt", mimeType="application/octet-stream")]
public static const FontXml:Class
}
}
使用靜態類別當作素材來源時要注意的地方是,AssetManager是用class名稱來註冊的
當要embed動畫所需要的textureAtlas素材的時候要注意一件事那就是
textureAtlas素材的圖片名稱跟embed的class名稱要一樣
但xml的名稱就不一定要跟embed的class名稱一樣了。
如果有去看過原始碼的話,就會發現AssetManager是先把class的lee先註冊到了
texture的Dictionary裡,之後載入textureAtlas的xml之後發現被註冊到
texture的Dictionary裡的lee是作為textureAAtlas需要的素材,所以就把
texture的Dictionary裡的lee移除掉,然後重新用lee這個名字去textureAAtlas的
Dictionary裡註冊,所以當textureAtlas註冊名字之後,你用getTexture()方法去
找lee的這個texture是找不到的,你只能用lee這個名字並且使用getTextureAtlas()這個方法
找到已經加入的textureAtlas素材。
//使用的話就這樣使用
var am:AssetManager = new AssetManager();
am.enqueue(EmbedAsset);
var lee:MovieClip = new MovieClip(mAssetManager.getTextureAtlas("lee").getTextures("lee_idle"), 24);
Starling.juggler.add(lee);
addChild(lee);
剛剛有說了註冊的名字是使用class名稱,所以如果是用靜態類別載入素材的話
要取得bg.jpg這張圖片就要用BGG的這個名稱。
如果是要取得聲音的話
可以用AssetManger裡的playSound("註冊的名字")取得聲音並且播放
playSound方法是會返回一個soundChannel,在呼叫這個方法時還可以帶
有關soundChannel的參數給他可給可不可。
如果是字型的話AssetManager會自動註冊字型到textField裡面,不用再呼叫
TextField.registerBitmapFont()註冊字型,而且也沒有方法可以抓取
載入進來的bitmapFont圖片,另外跟textureAtlas比較不一樣的地方是
要使用的時候不是用class的名稱,是要用這個字型的名稱,那字型的名稱
要去哪裡找呢?請把.fnt的這個檔案打開,其實裡面也是xml的結構
在第二行的地方會看到face="Brisk",這個face的地方就是字型的名稱
所以就要用Brisk這個名字,下面是使用方法
var text:TextField = new TextField(700, 100, "", "Brisk", 50, 0x000000, false);
text.hAlign = HAlign.LEFT;
text.text = "This is Bitmap Font Generator Test !";
addChild(text);
再來就是要講使用AIR在行動裝置上時要怎麼AssetManager
用AIR的話第一個還是可以使用上面所說的靜態類別的方法因為
那是把素材內嵌至swf裡比較沒有路徑的問題,但如果沒有要用embed的話
可以先把素材一起放在app的資料夾底下需要的時候在叫來用就好了
那要怎麼把宿才放在app資料夾底下呢?這邊我是用flash cs6所以我就來
講一下怎麼做。
第一步:選取檔案/android設定(如果是ios的話就是ios設定)
第二步:會看到下面有一個包含的檔案,然後會有三顆按鈕分別是
加入檔案、刪除檔案、加入資料夾,如果是只有幾個檔案的話可以
選擇加入檔案,但如果是有很多素材在同一個資料夾裡的話就可以選
加入資料夾,這樣這個資料夾裡的素材就都會被加入了
加入了檔案之後就要來看程式要怎麼寫了
//使用File類別,然後用applicationDirectory的屬性取得app根目錄
var appDir:File = File.applicationDirectory;
//之後再使用File的resolvePath()方法取得相對路徑
//如果是直接寫檔案路徑的話就會找到app/assets/bg.jpg;
am.enqueue(appDir.resolvePath("assets/bg.jpg"));
//這邊也可以直接寫資料夾名稱,AssetManager會自動搜尋可以用的
//全部素材並且載入註冊,非常的方便
am.enqueue(appDir.resolvePath("assets"))
再來講一下如何抓取檔案讀取的進度,AssetManager裡有一個loadQueue()
這也是呼叫AssetManager開始異步載入列隊裡的素材,這個方法必須帶一個function
給他,以便AssetManager callBack回來載入的進度
mAssetManager.loadQueue(onProgress);
private function onProgress(number:Number):void {
var percent:int = Math.round(number * 100);
trace("progress = " + percent + " %");
if (number == 1) {
(mStarling.root as Game).start(am);
}
}
另外AssetManager 也可以載入網路上的資源下來,就把路徑換成http路徑就好了
還有載入的方法可以混著用類似像是下面這樣
//可以同時擺路徑也可以擺靜態類別
am.enqueue("asset/bg,jpg",EmbedAsset);
有關AsetManager的document可以來這邊看
AssetManager
2013/07/17更新
後來又自己鬼打牆遇到了一些問題,就再來記錄一下
1.用enqueue()放入要載入的檔案後,要記的要用loadQueue()載入檔案阿 !
就算沒有要知道載入進度也是一樣
2.在air的時候如果要用enqueue()掃資料夾的檔案的時候
要記得資料夾要跟fla檔案放在一起(用flash ide編譯的話)
這樣用appDir.resolvePath("assets")才會找的到檔案
千萬不要放在不同層,因為就算在路徑上加上../
air應用程式在找的時候也是從app路徑下開始找
所以還是找不到