본문 바로가기

액션스크립트 2.0

이벤트 모델 : EventDispatcher 클래스 dispatchEvent 구현 - AS2.0


문제

AS2.0에서 dispatchEvent를 어떻게 구현할까요?

 

사용법

액션스크립트 2.0에 와서 제대로된 클래스 키워드가 도입되면서 OOP 구현이 가능하게 되었습니다.

3.0에서 사용하는 dispatcherEvent 기능을 사용하여 이벤트리스너를 등록해서 값을 받아오는 클래스를 구현해 보도록 하겠습니다..

 

/******************************************

 * TT.as : 리스너 클래스

 * EventSource.as : 이벤트를 발생하는 클래스

 * TT_test : 소스 fla 파일

 ******************************************/

 

//EventSource.as 클래스 -------------------------------------------

 

import mx.events.EventDispatcher;    //이벤트관리 클래스
import mx.utils.Delegate;                  //스코프해결 클래스

 

class EventSource
{
     private var _dispatcher: EventDispatcher;
     private var _container: MovieClip;
 
     public function EventSource( $target: MovieClip )
     {
          this._container = $target;
          this.setEvent();
     }
     private function setEvent(): Void
     {
          this._dispatcher = new EventDispatcher();
          this._container.onLoad = Delegate.create( this, dispatcher );

          // this._container.onRollOver= Delegate.create( this, dispatcher );

          // this._container.onRollOut= Delegate.create( this, dispatcher );

          // this._container.onRelease= Delegate.create( this, dispatcher );

     }
     private function dispatcher(): Void
     {  
          var info: Object = {};
          info.data = "데이타";
          this._dispatcher.dispatchEvent( { type: "onLoadComplete", target: info } );

         // this._dispatcher.dispatchEvent( { type: "rollOver", target: info } );
         // this._dispatcher.dispatchEvent( { type: "rollOut", target: info } );
         // this._dispatcher.dispatchEvent( { type: "click", target: info } );
     }
     //register event 
     public function addEventListener( event: String, listener: Object ): Void
     {
          this._dispatcher.addEventListener( event, listener );
     }
     public function removeEventListener( event: String, listener: Object ): Void
     {
          this._dispatcher.removeEventListener( event, listener );
     }
}

 

//TT.as  클래스 -------------------------------------------

 

import mx.events.EventDispatcher;
import mx.utils.Delegate;
import EventSource;

class TT
{
     private var _obj: EventSource;
     public function TT( $target: MovieClip )
     {
          this._obj = new EventSource( $target );
          //Delegate.create(scopeObject, function) 레퍼런스 참조;
          this._obj.addEventListener( "onLoadComplete", Delegate.create( this, onLoadHandler));

          // this._obj.addEventListener( "rollOver", Delegate.create( this, rollOverHandler));

          // this._obj.addEventListener( "rollOut", Delegate.create( this, rollOutLoadHandler));

          // this._obj.addEventListener( "click", Delegate.create( this, clickHandler));
     }
     private function onLoadHandler( e: Object ): Void
     {
          trace( "\""+e.target.data+"\" 출력" );
     }

     // private function rollOverHandler( e: Object ): Void {};

     // private function rollOutLoadHandler( e: Object ): Void {};

     // private function clickHandler( e: Object ): Void {};
}

 

//TT_test.fla 파일 -------------------------------------------

 

import TT;

var _tt: TT = new TT( this );

 

전체 구성을 보면 3.0과 비슷한 체계를 가지고 있음을 알 수 있습니다. 3.0과 몇가지 차이점을 비교해보면

첫번째는 package 키워드가 없음.

두번째는 스코프문제를 Delegate 클래스를 사용해서 해결, 3.0에는 스코프문제가 없음.

세번째는 dispatchEvent 인자로 Event 클래스가 아닌 Object 를 사용하고 기본인자로 type 속성을 가짐.

 

아직까지 2.0버전이 많이 쓰여지고 있는 점을 가만하면 2.0도 클래스를 활용해 OOP형태로 구현해보는것도 좋은 방법이 될 수 있겠네요.




'액션스크립트 2.0' 카테고리의 다른 글

AS2.0에 대한 생각...  (0) 2010.10.25