搜尋部落格文章

2011年11月12日 星期六

使用Loader類別載入外部共享元件庫swf檔

隨著元件增加,以及內嵌字型,導致fla檔體積越來越大
不僅發佈swf耗費很長的時間,過大的檔案也可能影響著伺服器的流量
為了可以更有效率的工作,
首先,先將下述幾樣檔案拉到外部swf中,

製作上使用的檔案類型不外乎就是
1. 圖片
2. 音樂音效
3. 字型

可以的話,最好是一個一個分類
例如:紙娃娃衣物,家具,壁紙,地磚.音樂.字型...
未來若有增加新的物品,就可以單獨增加額外的swf作載入,若有修改某幾樣物品,則修改相對的swf檔案即可


專案初期只對Loader所載入的東西去抓取裡面的Class,

this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE,eventComp);
private function eventComp(e:Event):void{
  (e.currentTarget as LoaderInfo).applicationDomain.getDefinition("className");
}

後來加入preloader後,所有的外部swf在這個時候就要先載入了
載入後使用原本的方法便會抓不到外部元件
解決方法可以在loader.load(request:URLRequest, context:LoaderContext = null);
給loader指定第二個參數context:LoaderContext

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);


LoaderContext 類別包括三個屬性,可以讓您定義如何使用載入內容的環境:

checkPolicyFile:

請只在載入影像檔 (而不是 SWF 檔) 時使用這個屬性。如果將這個屬性設定為 true,Loader 會檢查原則檔的原始伺服器 。只有在內容不是源自包含 Loader 物件的 SWF 檔時,才需要執行這項步驟。如果伺服器授予 Loader 網域權限,Loader 網域中 SWF 檔的 ActionScript 就可以存取已載入影像中的資料;換句話說,您可以使用 BitmapData.draw() 命令,存取載入影像中的資料。

請注意,來自 Loader 物件以外網域的 SWF 檔可以呼叫 Security.allowDomain(),以允許特定網域。

securityDomain:

請只在載入 SWF 檔 (而不是影像) 時使用這個屬性。為不是源自包含 Loader 物件之檔案所屬網域的 SWF 檔指定這個方法。指定這個選項時,Flash Player 會檢查是否有原則檔,如果有,則來自跨網域原則檔中所允許網域的 SWF 檔就可以對載入的 SWF 內容進行跨 Script 處理。您可以將這個參數設定為 flash.system.SecurityDomain.currentDomain。

applicationDomain:

請只在載入以 ActionScript 3.0 撰寫的 SWF 檔 (而非影像或以 ActionScript 1.0 或 2.0
撰寫的 SWF 檔) 時使用此屬性。載入檔案時,您可以透過將 applicationDomain 參數設定為 flash.system.ApplicationDomain.currentDomain,指定檔案要包含在與 Loader 物件相同的應用程式網域中。藉由將載入的 SWF 檔置於相同的應用程式網域中,便可以直接存取其類別。如果您要載入的是包含內嵌媒體 (可以透過它們的相關類別名稱進行存取) 的 SWF 檔,這種做法就很有用。

沒有留言:

張貼留言