iYouMe 有明大戰

臉書無名算什麼?! 加入有明大戰才有更美好的明天!
友民們~ 讓我們一起來大亂鬥吧!

開啟線上demo

ActionScript 2 有DuplicateMovieClip方法,來複製場景上的實體,ActionScript 3 朝物件導向後,取消了DuplicateMovieClip方法,只能用元件庫綁定類別的方法,來重複new(建構)元件的實體,那已經拉到場景上,沒綁定類別的movie clip實體能不能複製呢!?
剛好專案上遇到這樣的問題,若為了使用一個場景大量視覺元件(均含實體名稱,但未綁定元件類別)的assets.swf,重複使用裡面的資源,我試了類似array的深複製(利用ByteArray),但失敗了,最後是使用URLLoader(binary format)去load assets.swf的binary data,再用loader去loadBytes,完成後去抓要複製的實體,每次都會傳回不同的引用,就能達到複製場景上實體的功能。

用以上的概念寫了一支demo,不過for demo,我就不分兩個檔案了,自己load自己:
DocTest.as 文件類別
01 package  {
02 import flash.display.Loader;
03 import flash.display.MovieClip;
04 import flash.display.Stage;
05 import flash.display.StageAlign;
06 import flash.display.StageScaleMode;
07 import flash.events.Event;
08 import flash.events.MouseEvent;
09 import flash.net.URLLoader;
10 import flash.net.URLLoaderDataFormat;
11 import flash.net.URLRequest;
12 import flash.utils.ByteArray;
13
14 /**
15 * ...
16 * @author Focus1921
17 *
18 * 複製無綁定類別movie clip場景實體(stage instance)實作demo(fla文件類別)
19 */
20 public class DocTest extends MovieClip {
21 //stage instance
22 public var test_box_mc:MovieClip; //場景上僅有的movie clip, 實體名稱test_box_mc23
24 private var ba:ByteArray; //儲存自己這個swf的byte array
25 private var ldr:Loader; //建一個loader來load ba
26 private var tmpX:Number;
27 private var tmpY:Number;
28
29 /**
30 * 建構式
31 */
32 public function DocTest() {
33 if (stage) {
34 init();
35 }else {
36 addEventListener(Event.ADDED_TO_STAGE, init);
37 }
38 }
39
40 private function init(e:Event = null):void {
41 stage.scaleMode = StageScaleMode.NO_SCALE;
42 stage.align = StageAlign.TOP_LEFT;
43
44 //確保主場景load只load自己一次,避免溢位
45 if (parent is Stage) {
46 trace("parent is Stage");
47 //建構url loader(binary)去load自己的byte array
48 var _urlLoader:URLLoader = new URLLoader();
49 _urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
50 //trace(root.loaderInfo.url);
51 _urlLoader.load(new URLRequest(root.loaderInfo.url));
52 _urlLoader.addEventListener(Event.COMPLETE, onURLLdrComplete);
53 }
54
55 //建構loader, 註冊complete完成偵聽
56 ldr = new Loader();
57 ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onLdrComplete);
58
59 //stage註冊click偵聽
60 stage.addEventListener(MouseEvent.CLICK, onStageClick);
61 }
62
63 //---Event Handler-----------------------------------------------------------------------------
64
65 private function onURLLdrComplete(e:Event):void {
66 e.currentTarget.removeEventListener(Event.COMPLETE, onURLLdrComplete);
67 //把load到的byte array存起來
68 ba = e.currentTarget.data;
69 }
70
71 private function onLdrComplete(e:Event):void {
72 //用實體名稱去抓到要複製的movie clip,每次load完都會傳不同的引用
73 var _mc:MovieClip = MovieClip(ldr.content).getChildByName("test_box_mc") as MovieClip;
74 //屬性設定不同的值,證明的確不是同一個引用
75 _mc.x = tmpX;
76 _mc.y = tmpY;
77 _mc.alpha = Math.random();
78 //加入顯示清單
79 addChild(_mc);
80 }
81
82 private function onStageClick(e:MouseEvent):void {
83 //把點擊座標存起來,當作複製後的mc的座標
84 tmpX = e.stageX;
85 tmpY = e.stageY;
86 //loader去load(loadBytes)存起來的byte array(ba)
87 ldr.loadBytes(ba);
88 }
89
90 }
91
92 }
我只儲存一次ByteArray,沒有重複load,較不會浪費系統資源跟下載頻寬,anyway 最後專案還是採用元件綁定類別的方法,這裡就當作個紀錄。
線上demo(檔案位置google site)
原始檔下載(檔案位置SkyDrive)

標籤:actionscript3, as3, demo, test

意見

您必須是成員才能發表評論!

加入 iYouMe 有明大戰

focus1921 focus1921在4:06pm對2010 二月 26的評論
其實最大的差異是元件沒有綁定類別,是作為拿到了已經編譯過的assets.swf,卻沒辦法為它加上類別時的考量
澄琳的AS3.0新手起步之路 澄琳的AS3.0新手起步之路在4:01pm對2010 二月 26的評論
@@這個跟那個花花的範例好像差不多耶!
可是寫起來就是不一樣
focus1921 focus1921在9:02am對2010 二月 26的評論
我知道為什麼常常誤刪了~ 不小心按到叉叉的話,他不會問確定刪除就直就刪掉了...
focus1921 focus1921在9:02am對2010 二月 26的評論
囧 我又誤刪留言了... 那A安奈...

OK啊,下回寫個有明大戰syntax highlight的分享吧!!

這是一個功能最強!最新型態!LV 級的全功能型網站!完全免費讓大家自由聊天交友討論交換資訊與分享的優質空間 Feel Free and Get High!  讓網路的空間變美好、讓大家開開心心玩樂生活,是有明大戰成立的目標!絕對超越無名小站!小正正邀請你一起來大戰!一起有名!

© 2010   建立者:小正正   Powered by .

成員徽章  |  報告問題  |  服務條款

登入聊天