电竞比分网-中国电竞赛事及体育赛事平台

分享

AS3復(fù)制可視對象(轉(zhuǎn))

 KILLKISS 2011-08-03

AS3復(fù)制可視對象

 

一,復(fù)制舞臺上的影片剪

方法1——反射方法:

var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class;

var clone_mc:DisplayObject = new ClassRef();

addChild(clone_mc);

方法2——構(gòu)造器方法:

var ClassRef:Class = t_mc.constructor;

var clone_mc:MovieClip = new ClassRef();

addChild(clone_mc);

方法3——編譯器自動生成類方法:

    此方法是方法1的變種,它比方法1更加簡單、粗暴、有效。下面我將為大家特別講解一下這個方法:

    首先,在庫中創(chuàng)建一個影片剪輯,隨意繪制一個圖形,然后在第一幀上加上一個單行注釋符“//”;

    接下來,將剛才創(chuàng)建的影片剪輯拖到舞臺上,創(chuàng)建一個示例,命名為“t_mc”;

    現(xiàn)在,重點來了,我們在主時間線上寫下如下所示語句,然后按下Ctrl+Enter,仔細觀察一下輸出面板中輸出的信息。

    trace(getQualifiedClassName(t_mc));

    你發(fā)現(xiàn),輸出結(jié)果是“_fla::Timeline_1 ”。出于對函數(shù)getQualifiedClassName的作用的清晰理解,你立刻就想到,這個Timeline_1應(yīng)該就是編譯器自動為我們的庫中的影片剪輯創(chuàng)建的類。我們貌似可以用這個類new出多個一樣的影片剪輯來哦!是不是這樣呢?我們來驗證一下:

    var clone_mc:DisplayObject = new Timeline_1();

    addChild(clone_mc);

    Ctrl+Enter,你驚喜的發(fā)現(xiàn),我們成功了!實驗到這里,可能很多朋友已經(jīng)興奮地準(zhǔn)備去寫學(xué)習(xí)總結(jié)了。兄弟們,不要急,我們的實驗還沒完——現(xiàn)在,我們用同樣的方法,再次在庫中創(chuàng)建一個影片剪輯。然后也將它拖到舞臺上創(chuàng)建一個實例,取名為“d_mc”。接下來,我們將trace(getQualifiedClassName(t_mc)); 語句中的“t_mc”改成“d_mc”。測試一下影片,這次輸出的結(jié)果竟然是“flash.display::MovieClip”。

    忽忽!傻了吧,不能用new MovieClip來復(fù)制“d_mc”了吧!

    咋解決這個問題呢?我給大家一點點提示:試試將庫中那兩個影片剪輯各取一個響亮的名字(名稱),然后再看一下輸出的類名是什么。

使用以上方法復(fù)制影片剪輯時需要注意:

必須在庫中創(chuàng)建影片剪輯,并將庫中的影片剪輯拖到舞臺上創(chuàng)建了一個實例;
影片剪輯的幀上必須包含代碼(注釋也行,最簡單的就是加一個單行注釋符號“//”);

二,復(fù)制Loader加載的swf

         復(fù)制外部加載的swf是一個相對高級的操作,步驟比較多,過程相對復(fù)雜,要闡述清楚原理細節(jié)需要很大篇幅的文字,因此,這里我就偷懶不詳細寫說明了,純用代碼來說明問題,希望對看得懂的朋友起到拋磚引玉的作用。

方法1——ByteArray深度復(fù)制

var byteLoader:URLLoader = new URLLoader();

byteLoader.dataFormat = URLLoaderDataFormat.BINARY;

byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);

var loader:Loader = new Loader();

loader.y = 200;

addChild(loader);

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);

function loadInitHandler(evt:Event):void

{

         var cloneLoder:Loader = new Loader();

         addChild(cloneLoder);

         cloneLoder.loadBytes(byteLoader.data);

}

byteLoader.load(new URLRequest("t.swf"));

function loadCompleteHandler(evt:Event):void

{

         loader.loadBytes(byteLoader.data);

}

         簡單原理:用URLLoader將外部的swf以二進制數(shù)據(jù)格式加載到ByteArray中,然后用Loader類的loadBytes去加載URLLoader中的ByteArray。

方法2——ApplicationDomain 運行時動態(tài)類復(fù)制

var loader:Loader = new Loader();

loader.y = 200;

addChild(loader);

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);

var context:LoaderContext = new LoaderContext();

context.applicationDomain=ApplicationDomain.currentDomain;

loader.load(new URLRequest("t.swf"), context);

function loadInitHandler(evt:Event):void

{

         var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;

         var clone_mc: MovieClip = new ClassRef();

         addChild(clone_mc);

}

注意:

1.以上兩種復(fù)制方法,由于都需要加載swf文件,因此需要文件級別的本地安全性;
2.使用第二種方法(ApplicationDomain)時,生成“t.swf”時必須為舞臺添加文檔類屬性。添加的文檔類可以是具體的外部as類,也可以僅僅是一個名字。上例中我添加的文檔名為”TestClass”, getDefinition("TestClass")中填的參數(shù)內(nèi)容應(yīng)該跟要復(fù)制的swf的文檔類名相同。
3. ApplicationDomain還有更多高級用法,有興趣的高級AS程序員可以去研究一下。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多