2009年7月6日 星期一

{AS} AS3.0的客製事件

AS3.0和AS2.0最大的不同點,就是事件流。
前陣子在看各AS高手的blog時,看到許多人都有提到-客製事件!!
當下我馬上寫了DEMO,但我百思不得其解的是,為什麼Event要客製?
有這樣的疑問是因為,控制客製Event的發送時間點,往往會掛在另一個事件的偵聽程式裡,與其這樣,何不在原先的偵聽程式中去作我們想作的事就好?
打個比方講:
a.swf load了b.swf,b.swf又load了c.swf,而c.swf又load了d.swf,
最後d.swf裡有個loader又load了一個e.swf。
舉個例子幹嘛這麼複雜...因為這樣反差比較大....
如果我們希望e.swf被load完時 a.swf有個ppp_mc會不見,以前的我也許會在d.swf裡這樣寫...

var ldr:Loader=new Loader();
var url:URLRequest=new URLRequest("e.swf");
ldr..contentLoaderInfo.addEventListener(Event.COMPLETE,completePPP);
ldr.load(url);
function completePPP(e:Event):void{
MovieClip(e.target.parent.parent.parent.parent.ppp_mc).visible=false;
}


鳩竟~~~孩子的爸爸到底是誰...
也許你覺得很好很笑,但之前在職訓時,所有的人都是這樣寫...更慘的是連老師也沒說這樣不對...不過也的確沒有不對啦!!

但如果我們有一天想要把c.swf這層拿掉,或者在中間多加一層時...
你就得再找徵信社,查查孩子的爸爸到底又是誰...

難道客製Event能夠找出爸爸是誰嗎,沒那麼神奇,因為有了客製Event,你根本不用知道爸爸是誰...

我們只要把剛剛ldr的偵聽程式改成

function completePPP(e:Event):void{
dispatchEvent(new Event("e_is_loaded" , true ));
//第一個參數為我們客製的Event名稱,
//第二個為事件的bubbles,設成true讓事件可以上浮,讓所有老爸都能聽到這個小孩在哭爸
}


然後在a.swf中偵聽這個客製Event


this.addEventListener("e_is_loaded",hidePPP);
function hidePPP(e:Event):void{
this.ppp_mc.visible=false;
}


輕輕鬆鬆,打完收工!!

之後不管你結構怎麼改,一樣可以在e.swf被load完時,作你想作的事。

沒有留言:

張貼留言