2011-05-29 71 views
-1

我試圖拼湊外部加載的SWF中的一序列的投影機和我的一般問題將盡可能短,因爲它可以。AS3:自定義事件傳播

如果外部SWF裝入ctrl(影片剪輯的一個實例在創作過程中放置​​在階段)具有在其第一和最後一個幀:

dispatchEvent(new Event("FIRST_FRAME")); // in the first frame, and: 
dispatchEvent(new Event("LAST_FRAME")); // in the last frame 

然後 - 應這些事件是「聽到」的CTRL內容器?

目前我只似乎能夠將加載的內容內聽那些事件,而不是「高」,我的意思是 - 如果我在裝載機完整聽衆說:

mc:MovieClip = MovieClip(e.currentTarget.content); 
mc.addEventListener("LAST_FRAME", function(){ // something }); 

那麼事件聽到的,但不是我說:

ctrl.addEventListener("LAST_FRAME", function(){ // something }); 

後者似乎更爲強勁,因此我掙扎,它的工作,但我想我已經錯過了一些經驗;-) 有任何人都通過這個?我的方法是正確的還是應該採取另一條路?

歡呼每一個人。

+0

,你可以得到調度,你加載到當前的應用程序事件的SWF,然後你的swf添加到一個名爲'ctrl'的顯示對象?如果是這樣你需要啓用冒泡時發出事件像這樣'dispatchEvent(新的事件(「FIRST_FRAME」,真));」 – Taurayi 2011-05-29 14:19:25

回答

0

你可以讓你的crtl顯示對象通過在分派你的事件時將bubbles選項設置爲true來接收從外部swf分派的事件。請看下面的例子,其中swfB.swf也被裝入swfA.swf編寫:

SWFB:

package swfb 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      const SECOND:int = 1000; 

      var timer:Timer = new Timer(5 * SECOND, 1); 
      timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
      timer.start(); 

     }// end function 

     private function onTimerComplete(e:TimerEvent):void 
     { 
      dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE, true, true)); 

     }// end function 

    }// end class 

}// end package 

SWFA:

package swfa 
{ 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.TimerEvent; 
    import flash.net.URLRequest; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); 
      loader.load(new URLRequest("swf/SWFB.swf")); 


     }// end function 

     private function onLoaderComplete(e:Event):void 
     { 
      var loaderInfo:LoaderInfo = LoaderInfo(e.target); 

      var container:Sprite = new Sprite(); 
      container.addChild(loaderInfo.content); 
      container.addEventListener(TimerEvent.TIMER_COMPLETE, onContainerTimerComplete); 
      addChild(container); 

     }// end function 

     private function onContainerTimerComplete(e:TimerEvent):void 
     { 
      trace("TIMER COMPLETE!"); 

      e.stopPropagation(); 

     }// end function 

    }// end class 

}// end package 

swfB.swf也將調度Timer事件它加入5秒後到舞臺。當它分派事件時,氣泡和可取消選項設置爲true。

在swfA.swf編寫的swfB.swf也被加載到它,然後加入到稱爲container的顯示對象容器。然後,將一個事件偵聽器添加到容器,該容器偵聽SWFB.swf中的Timer事件以進行分派。當它的派出onContainerTimerComplete()事件處理程序調用計時器事件的stopPropagation()方法(顧名思義)阻止事件的傳播。

+0

多謝您詳細的課程我都沒有想到這兩個事件屬性,但這是有道理的,不幸的是我現在無法深入這項工作,但很快就會嘗試,再次感謝! – user776686 2011-05-30 19:22:34