2009-12-23 21 views
1

我有點問題...一遍又一遍地加載相同的SWF。有一個更好的方法嗎?

我們有一個應用程序需要根據用戶輸入加載不同數量的行圖形。目前,每行SWF都使用Flash.Display.Loader重複加載。 swf比較大(17k),加載10個左右需要一些時間。有沒有辦法只加載一次這個文件並多次使用它?

我對Flash/actionscript非常新穎。如果有任何其他信息需要讓我知道,我會盡力提供。

謝謝。

回答

2

嘿,你可以加載一次;您可以將所有資產放在一個SWF中,並且一旦加載就可以在必要時使用它們。

例如,假設您要在要加載的SWF上使用兩個圖形行(影片剪輯)rowA和rowB;這個SWF將作爲您的資產庫。你需要做的是在你的庫中創建rowA和rowB影片剪輯,並將它們設置爲導出以供Actionscript使用。 (在FLA的庫上,右鍵單擊它們並單擊屬性,然後選擇Export for Actionscript,在Class輸入字段中分別輸入「rowA」和「rowB」)。現在你已經擁有了你的資源(他們不必在舞臺上)發佈swf文件。

現在,讓我們轉到SWF,在其中實際使用此「庫」。在這裏,你只需要加載你的SWF庫(帶有圖形資源的庫),你就很好。代碼示例,

// Our URL Request 
    var req:URLRequest = new URLRequest(); 
    req.url = "assets.swf"; 

    // Let create our loader 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibLoaded); 

    var context:LoaderContext = new LoaderContext(); 
    context.applicationDomain=ApplicationDomain.currentDomain; 

    loader.load(req,context); 


    function onLibLoaded(e:Event):void 
    { 
    createRows(); 
    } 

    function createRows() 
    { 
    var myRowAClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowA") as Class; 
    var rowA:MovieClip = new myRowAClass() as MovieClip; 
    this.addChild(rowA); 

    var myRowBClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowB") as Class; 
    var rowB:MovieClip = new myRowBClass() as MovieClip; 
    rowB.y = rowA.height; 
    this.addChild(rowB); 
    } 

正如你所看到的,一旦你的資產庫被加載,你可以使用任何你喜歡的資產。無論如何,希望這有助於,並希望是你在找什麼。

2

你可以用另外兩種方法來falomir說的話:

1 .-如果你的SWF是隻是一個形象(你可以使用它作爲一個位圖),您可以創建所加載的一個BitmapData SWF,然後用它多次,因爲你需要:

var bmp:BitmapData = new BitmapData(loader.width, loader.height, true, 0); 
bmp.draw(loader); 
var row1:Bitmap=new Bitmap(bmp); 
var row2:Bitmap=new Bitmap(bmp); 

2:如果您的SWF是動畫和/或交互(不只是一個位圖),你可以加載它作爲一個二進制的URLLoader,然後使用Loader.loadBytes在您的應用程序中複製它:

var urlloader:URLLoader = new URLLoader(); 
urlloader.dataFormat = URLLoaderDataFormat.BINARY; 
urlloader.addEventListener(Event.COMPLETE, swfloaded); 
urlloader.load("miswf.swf"); 
function swfloaded(e:Event):void { 
    var bytes = urlloader.data; 
    var row1:Loader = new Loader(); 
    row1.loadBytes(bytes); 
    var row2:Loader = new Loader(); 
    row2.loadBytes(bytes); 
} 

請注意,loadBytes是異步的,因此您需要等待它的loaderInfo COMPLETE事件能夠處理它的內容......它與您正在做的(使用Loader)類似,但它只需要一個服務器請求。

相關問題