2010-12-06 63 views
1

我在AS3中處理事件有一個奇怪的問題。as3事件處理

我有兩類:

public class Configurator extends Sprite { 

    public function Configurator() { 
     this.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, this._test); 
     var fp = new FramedPhoto(); 
    } 

    protected function _test(event:Event) { 
     trace('_test()'); 
    } 
} 

,第二個:

public class FramedPhoto extends Sprite { 

    public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded'; 

    public function FramedPhoto() { 
     trace('FramedPhoto()'); 
     this.dispatchEvent(new Event(FramedPhoto.FRAMED_PHOTO_LOADED, true, false)); 
    } 
} 

問題是,_test()不被解僱。任何想法在這裏可能做錯了什麼?

測試包的源文件可從http://blackbox.home.pl/test.zip

回答

1

事件的調度是一個分層的方式,所以只是聽一個事件的地方不會做的伎倆。 你需要做的是讓你的配置程序聽取發送該事件的對象或一個以上的它在顯示列表中。如果你想捕捉所有的事件,你需要傾聽他們最上面的對象,stage

+0

感謝grapefrukt,我現在有了一點啓發。 – 2010-12-06 10:01:47

1

grapefrukt碰到了頭,但更具體的它被稱爲事件流。簡單地說,當從顯示列表中的顯示對象調用dispatchEvent()時,有三個階段,它們是捕獲階段,目標階段和冒泡階段。在捕捉階段,Flash播放器從舞臺到顯示對象的顯示列表中,調用dispatchEvent()。然後,在目標階段,目標顯示對象調度該事件。然後在氣泡階段,事件起泡到舞臺。

對於您的情況,如果您希望Configurator顯示對象聽到從FramedPhoto顯示對象派發的事件,則必須將FramedPhoto添加到其顯示列表中。

我冒昧給你的項目添加一個文檔類,因爲你應該避免使用時間線。

package 
{ 
    import com.Configurator; 
    import flash.display.MovieClip; 

    public class Main extends MovieClip 
    { 
     public function Main():void 
     { 
      init(); 

     }// end function 

     private function init():void 
     { 
      var configurator:Configurator = new Configurator(); 
      addChild(configurator); 

     }// end function 

    }// end class 

}// end package 

我進口的配置類(改名從ABC封裝到COM)宣佈,實例化,並把它添加到顯示列表中。

package com 
{ 
    import com.FramedPhoto; 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Configurator extends Sprite 
    { 
     public function Configurator():void 
     { 
      var framedPhoto:FramedPhoto = new FramedPhoto(); 
      addChild(framedPhoto); 

      framedPhoto.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, framedPhotoLoadedHandler); 

     }// end function 

     public function framedPhotoLoadedHandler(e:Event):void 
     { 
      trace("framePhotoLoadedHandler()"); 

     }// end function 

    }// end function 

}// end function 

接下來在您的配置器類中,我導入了您的FramedPhoto類,並聲明並實例化了它。然後,我添加了一個事件監聽器,它監聽從framePhoto顯示對象分派的事件,並調用framedPhotoLoadedHandler()。

package com 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class FramedPhoto extends Sprite 
    { 
     public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded'; 

     public function FramedPhoto():void 
     { 
      addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

     }// end function 

     private function addedToStageHandler(e:Event):void 
     { 
      dispatchEvent(new Event(FRAMED_PHOTO_LOADED, true)); 

     }// end function 

    }// end function 

}// end function 

最後在FramePhoto I類添加一個事件監聽到它,當FramePhoto顯示對象被添加到階段進行偵聽。當它被添加到舞臺時,它將調用addedToStageHandler(),它將調度該事件並將被捕獲到父配置器顯示對象中。

我希望這有助於:)