2010-12-06 21 views
1

AS3のイベント処理に奇妙な問題があります。as3イベント処理

私は、2つのクラス持っている:問題は)(_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)); 
    } 
} 

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()'); 
    } 
} 

2つ目を。何がここで間違って行うことができる任意のアイデア?ソースファイルと

テストパッケージには、イベントがこれだけトリックを行うことはありませんどこにイベントを受け取る、階層的に派遣されているhttp://blackbox.home.pl/test.zip

答えて

1

から入手可能です。 あなたがする必要があるのは、コンフィグレータがイベントをディスパッチするオブジェクトを聞くことです。ディスプレイリストにはを上にしてを上書きします。すべてのイベントをキャッチしたい場合は、それらのすべての最上位のオブジェクトを聴く必要があります。stage

+0

ありがとうございますgrapefrukt、私は今少し啓発があります。 –

1

グレープフルクは頭の釘を打つが、より具体的にはイベントフローと呼ばれる。 dispatchEvent()が表示リスト内の表示オブジェクトから呼び出されるときには、3つのフェーズがあります。これらはキャプチャフェーズ、ターゲットフェーズおよびバブルフェーズです。キャプチャフェーズでは、Flash Playerは、ステージから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 

次にConfiguratorクラスで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クラスの最後に、私はFramePhoto表示オブジェクトがステージに追加されたときのためにリッスンしている、それにイベントリスナを追加しました。ステージに追加されるとaddedToStageHandler()が呼び出され、イベントが送出され、親のコンフィグレータの表示オブジェクトにキャッチされます。

私はこれが助けて欲しいと思っています:)