Actionscript3.02010.06.13 20:43

Actionscript 3.0 의 Event Model 은 이벤트를 dispatch 하는 방식으로 이루어져 있습니다. 많은 클래스들이 클래스 내부적으로 "어떠한 행동"에 대해 이벤트를 외부로 알려주는 방식을 사용하고 있습니다. 예를 들어 Loader 클래스를 사용할때, 이미지나 파일들을 로드한 후에 Loader 클래스 내부적으로 이벤트 dispatch 가 일어나서 사용자나 개발자는 그 상황에 따른 후 처리를 할 수 있습니다.


import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;

var ld:Loader = new Loader();
ld.addEventListener(Event.COMPLETE, hnLoaded);

function hnLoaded( e:Event ):void{   
	// 로드끝
}

// Loader 내부
public class Loader extends EventDispatcher{
	public function Loader(){}
	private function loaded(){
		dispatchEvent(new Event(Event.COMPLETE));
	}
}

개발자들은 addEventListener 를 이용하여 내부적으로 dispatchEvent 되는걸 청취(addEventListener) 하고 있다가 반응이 오면 다운로드 된 데이터에 접근 가능 하게 됩니다. 이렇게 대부분의 AS3 이벤트 모델은 dispatch event 에 근거 하고 있습니다.


저도 AS3을 공부하고 초기에는 dispatchEvent 의 개념에 익숙하지 않아, 바보 같은 짓을 하곤 했는데요. 예를 들어 Event.ENTER_FRAME 으로 이벤트가 끝날때 까지 기다린다던지, Timer 를 이용하여 비슷한 방법을 사용하곤 했습니다. 

var ld:Loader = new Loader();
ld.addEventListener(Event.ENTER_FRAME, hnLoaded);

function hnLoaded( e:Event ):void{    
   // 로드끝
   if(ld.content) {

        // null 이 아니면 로드끝이라 판단
	ld.removeEventListener(Event.ENTER_FRAME, hnLoaded);
	
        // 로드후 후처리 로직 구현    
   } 
}



dispatch Event 는 그 밖에도 클래스의 재사용성에 대한 강점을 가지고 있습니다. 내부적으로 dispatch 되는 이벤트(행동)들을 addEventListener를 이용하여 청취하기만 하기 때문에 객체 유연성이 높습니다. 그 밖에도 여러 장점이 있지만, 자랑은 여기까지 하겠습니다.



dispatchEvent를 사용하지 않고 대안으로 사용할 수 있는 방법이 해당 행동에 대한 callback 메소드를 이용하는 것 입니다. Adobe에서 제공한 flashplatform optimizing content 문서를 보면 플래시 콘텐츠 최적화 방법중에 이벤트 구현을 dispatchEvent를 사용하기 보단 callback 을 사용하는게 더 효율적이라고 하고 있습니다. 이유는 여러가지가 있겠지만, 제가 생각하는 걸 나열해 보면 다음과 같습니다.


  • dispatchEvent 가 일어났다는걸 알기 위해서 addEventLister 를 등록해야 한다.
  • 너무 많은 addEventListener 사용은 메모리나 퍼포먼스에 영향을 줄수 있다.
  • 너무 많은 addEventListener 사용 코드를 지져분 하게 한다. (개인적 취향입니다.)

그래서 그 문서에서는 dispatchEvent 를 사용하지 말고 callback 메소드를 전달하여 이벤트 후처리를 수행하는게 퍼포먼스에 이점이 있다고 말하고 있습니다. 아래와 같은 방식으로요.


var ld:LoaderCallback = new LoaderCallback(hnLoaded);

public class LoaderCallback extends EventDispatcher{
	private var _callback:Function;   
	private var _ld:Loader;    
	
	public function LoaderCallback() {
		_ld = new Loader();
		_ld.addEventListener(Event.COMPLETE, loaded);
	}    
	public function load(url:String,callback:Function):void {
		_callback = callback;       
		_ld.load(new URLRequest(url));
	}    
	private function loaded(e:Event) {
		callback(e);
	}
}


callback 메소드를 로드를 수행하는 LoaderCallback의 load 메소드에 파라미터로 넘기기 때문에 따로 addEventListener를 등록할 필요도 없고 이벤트 관리를 효율적으로 할 수 있습니다.


프로젝트를 하면서 고민했던 부분이 바로 이 부분이었는데요. 퍼포먼스를 생각하면 (그밖에도 여러이점이 있겠지만) callback 을 사용해야 하지만, dispatchEvent 를 이용하면 나중에 API 로 변경 했을때 추가 작업없이 바로 사용 할 수 있다는 장점 때문에 두가지 선택 사항에서 고민을 많이 하였습니다. 그래서 내린 결론은 addEventLister 등록을 최소한으로 하고 API 로서 기능을 수행할 가능성이 적은 클래스는 callback 를 사용하고 API 의 기능을 수행해야 하는 객체에는 dispatchEvent 를 사용하였습니다. dispatchEvent 도 일일히 각각의 이벤트를 등록하여 청취하는 방법이 아니라, 하나의 이벤트를 수신하여 커스텀 이벤트에 있는 type 으로 이벤트 유형을 판단 하도록 하였습니다.


아래와 같은 방법은 3번의 addEventListener를 해야 되지만


stream.addEventListener(StreamEvent.PLAY,hnStreamPlay);
stream.addEventListener(StreamEvent.STOP,hnStreamStop);
stream.addEventListener(StreamEvent.PAUSE,hnStreamPause);

public class Stream extends EventDispatcher{ 
	public function Stream(){}
        public function play():void { 
		dispatchEvent(new StreamEvent(StreamEvent.PLAY));
	}  
	public function stop():void {
		dispatchEvent(new StreamEvent(StreamEvent.STOP));
	}
	public function pause():void {
		dispatchEvent(new StreamEvent(StreamEvent.PAUSE));
	}
}

function hnStreamPlay( e:StreamEvent ):void{}
function hnStreamStop( e:StreamEvent ):void{}
function hnStreamPause( e:StreamEvent ):void{}


아래 방법은 한개의 등록만으로 처리가 가능 합니다.

stream.addEventListener(StreamEvent.ECHO,hnStreamEcho);

public class Stream extends EventDispatcher{ 
	public function Stream(){}       
	public function play():void {
		dispatchEvent(new StreamEvent(StreamEvent.ECHO,StreamEvent.PLAY));
	}
	public function stop():void {
		dispatchEvent(new StreamEvent(StreamEvent.ECHO,StreamEvent.STOP));
	}
	public function pause():void{
		dispatchEvent(new StreamEvent(StreamEvent.ECHO,StreamEvent.PAUSE));
	}
}
function hnStreamEcho( e:StreamEvent ):void{ 
	// StreamEvent 에 label 을 구현함    
	if(e.label == StreamEvent.PLAY){} 
	else if(e.label == StreamEvent.STOP){}
	else if(e.label == StreamEvent.PAUSE){}
}


개인적으로 두번째 방법을 더 선호 하는데요. 그때 그때 상황에 따라 선택이 중요한것 같습니다.


Flashplatform 개발 작업이 다른 언어에 비해 이벤트를 관리해야 되는 상황이 많은데요. 사용하기 편한것도 좋지만, 메모리나 퍼포먼스, 코드 가독성을 생각하여 판단하는 능력이 필요 하다는 생각이 드네요.


posted by dongkang




Posted by Flash 동강
Actionscript3.02009.03.30 10:57
Flash에서 MovieClip을 이용한 작업을 하다 보면 MovieClip에서 일어나는 동작을 코드상에서 알아 내서 이벤트를 발생 시켜야 하는 경우가 있다. 예를 들어 다음과 같은 Timeline이 있을때 재생헤드가 30 frame에 도달 할때 이 동작을 알아 내어 코드를 실행 시켜야 하는 경우가 있다.


이럴 경우 30 frame에 dispatchEvent를 사용하여 MovieClip을 가지고 있는 객체에 이벤트를 전달해 주는 방법을 사용할 수 있다.
dispatchEvent(new Event("playheadreached");
MovieClip에서 전달한 이벤트는
this.addEventListener("playheadreached",headreachedHandler);
private function headreachedHandler(e:Event):void{ // 코드 실행 }
를 통해 전달 받을 수 있다. 하지만, 이 방법은 반드시 Timeline에 코드를 입력해야만 가능한 방법이다. 많은 Flash 개발자들이 Timeline상에 코드를 입력하는 방법이 매우 비효율 적이라는 것을 느끼고 있을 것이다. 왜냐 하면 타입라인에 입력된 코드를 찾기 위해 낭비 하는 시간이 굉장히 많기 때문이다. 그래서, AS3.0에서는 addFrameScript 라는 메소드를 제공해 주고 있다.
adobe에서 제공하는 "AS3.0 Document"에는 이 메소드가 나와 있지 않지만 상당히 유용한 메소드 이다. 사용 방법은 다음과 같다.

package {

	import flash.display.MovieClip;

	public class FrameTest extends MovieClip{
		public function FrameTest()
		{
			this.addFrameScript("29",onFrameHandler);
			
		}		
		private function onFrameHandler():void
		{
			trace("reached");
		}
	}
	
}
Document class를 FrameTest라고 지정했을때, MainTimeline에 있는 재생헤드가 30frame에 위치하면 onFrameHandler 함수가 호출 된다. 주의해야 할 점은 30frame에 위치 했을때 함수를 실행 시키기 위해서는 this.addFrameScript("29",onFrameHandler); 게 해야 한다는 점이다. 29frame을 지난 직후에 메소드가 실행 되는 방식이기 때문이다. 또한 해당 타임라인이 존재 하지 않으면 이 메소드는 실행 되지 않는다.
addFrameScript는 상당히 직관적이고, 간편한 타임라인 컨트롤 방법을 제공해 주고 있다. 하지만 좀 더 간편한 타임라인 컨트롤을 지원해 주는 클래스가 있어 소개하려고 한다. 얼마 전에 Adobe Flash professional 커뮤니티에서 흥미 로운 기술 문서를 보았다. 이 기술 문서의 내용이 오늘 소개하려고 하는 클래스 이다.

타임라인에서 일어 나는 동작을 알려주는, TimelineWatcher

TimelineWatcher는 addFrameScript와 같은 타임라인 이벤트를 관리 해 주는 클래스 이다. EventDispatcher를 상속 받고 있기 때문에 내부적으로 dispatchEvent를 통해 타임라인의 위치를 전달해 주고 있다.


예를 들어 위와 같은 타임라인 모션이 있다고 하자. 그리고 Document class는 WatcherTest로 지정 한다.

package {
	
	import flash.display.MovieClip;
	import flash.text.TextField;
	
	import com.refunk.events.TimelineEvent;
	import com.refunk.timeline.TimelineWatcher;
	
	public class WatcherTest extends MovieClip {
		
		public var ball:MovieClip;
		
		private var timelineWatcher:TimelineWatcher;
		private var output:TextField;
		private var loops:uint = 0;
		
		public function WatcherTest() {
			super();
			stop();
			output = new TextField();
			addChild(output);
			timelineWatcher = new TimelineWatcher(this);
			timelineWatcher.addEventListener(TimelineEvent.LABEL_REACHED, handleTimelineEvent);
			timelineWatcher.addEventListener(TimelineEvent.END_REACHED, handleTimelineEvent);
			gotoAndPlay(1);
		}

		private function handleTimelineEvent(e:TimelineEvent):void {
			switch (e.type) {
				case TimelineEvent.LABEL_REACHED:
					output.text = "label: " + e.currentLabel + "\nloops: " + loops;
					break;
				
				case TimelineEvent.END_REACHED:
					loops++;
					if (loops > 10) {
						stop();
						timelineWatcher.removeEventListener(TimelineEvent.LABEL_REACHED, handleTimelineEvent);
						timelineWatcher.removeEventListener(TimelineEvent.END_REACHED, handleTimelineEvent);
						timelineWatcher.dispose();
						timelineWatcher = null;
					}
					break;
			}
		}
	}
}
		
우선 TimelineWatcher를 생성하고, 파라미터로 MovieClip 객체를 넘긴다. 그리고 TimelineWatcher에 이벤트리스너를 등록한다. TimelineWatcher가 캡쳐 할 수 있는 이벤트는 두가지 이다.

TimelineEvent.LABEL_REACHED : 타임라인에 Label 값이 있는 곳에 재생헤드가 위치해 있으면 호출 되는 이벤트 이다.
TimelineEvent.END_REACHED : 재생헤드가 타임라인의 처음부터 끝까지 돌았을때 호출되는 이벤트이다.
 
 위의 코드에서는 LABEL_REACHED END_REACHED 모두 handleTimelineEvent를 호출 메소드로 등록하고 있다. 같은 메소드라도 전달되는 이벤트의 종류가 같기 때문에 e.type을 이용하여 이벤트를 구분하고 각각에 맞는 이벤트를 처리 할 수 있다. 그리고 TimelineEvent.END_REACHED 이벤트를 이용해서 타임라인이 10번 돌았을때 LABEL_REACHED , END_REACHED removeEventListener 해주고 TimelineWatcher의 dispose 메소드를 이용하여 내부적으로 돌아 가고 있던 ENTER_FRAME 이벤트를 해제해 준다. (TimelineWatcher.as 를 참고)  ENTER_FRAME 이벤트 자체가 상당히 CPU 사용량이 크기 때문에 이벤트가 모두 종료된 후에 dispose 메소드를 반드시 호출해 줘야 한다. addFrameScript가 내부적으로 어떻게 구현되어 있는지는 모르겠으나, TimelineWatcher가 보다 더 유용하게 사용될 수 있는 클래스인거 같다.

  Flash는 타임 라인이라는 강력한 기능을 가지고 있다. 타임 라인이 존재 한다는것은 표현을 좀 더 자유롭게 할 수 있는 도구를 가졌다고 할 수 있다. 그러나, 디자이너는 너무 타임라인에 의존하는 프로젝트를 진행하고 있고, 개발자는 Flash를 Flash답게 사용하지 않고, Flex같이 사용하는 경향이 강하다. 타입 라인을 좀 더 자유롭게 사용할 수 있도록 도와주는 addFrameScript나 TimelineWatcher를 통해 좀 더 효율적인 업무 협업을 할 수 있겠다는 생각이 들었다. 익숙하지 않은 상태에서 다루기는 쉽지 않겠지만, 간단한 AS 구조이니 만큼 TimelineWatcher 나 TimelineEvent 클래스 구조도 살펴보는걸 추천한다.



TimelineWatcher에 대한 기술문서

예제 다운 로드
Posted by Flash 동강
동강의AS3.0 강좌2008.12.11 01:52

디자인을 하다가 Flash 를 시작하시는 분이나, 일반 프로그래밍을 하다가 시작하는 분이나, Actionscript 의 이벤트라는 개념은 생소하게 다가 옵니다. 그래서 시작하는 분들이 조금이라도 빨리 이해를 돕고자 Event... 에 대해 이야기를 해 보겠습니다.  

Actionscript 3.0 을 시작하고 적응하기 어려웠던 점은 2.0 과 다르게 브로드 케스팅으로 이벤트를 호출하고 호출 받는 다는 점이었습니다. 2.0 에서도 그러한 개념이 있긴 했지만, 3.0 에 와서는 완전 바뀌었습니다.  

가장 많이 사용하는 flash.events.Event  = Event
flash.events.MouseEvent = MouseEvent  

초기에 Event 는 ENTER_FRAME 을 돌리기 위한 이벤트로 많이 사용되고 MouseEvent 는 마우스의 각기 반응들에 이벤트를 걸어 주기 위해 사용 됩니다. 그렇다면 어떠한 원리로 이벤트가 걸리게 되는 걸까요? ( 개념을 정리 하기 위한 추상적인 클래스이니, 고칠 부분을 알려 주시기 바람니다. )  

우선 Mouse 라는 Class 가 존재 합니다.

Mouse 라는 클래스 안에는 마우스의 상태가 MOUSE_OVER ,MOUSE_OUT, CLICK 되었을때의 호출되는 함수(여기에서는 각각의 문을 함수라고 생각하시면 됩니다 ) 가 정의 되어 있습니다. 이 세개의 문들은 마우스 이벤트가 일어날때를 대비 해서 항상 기다리고 있지요. (addEventLister 로 이벤트가 걸렸을 경우에만 기다리고 있습니다. )

이 문이 열리는 것이 마우스 이벤트가 실행 되었다는 의미 입니다. Actionscript 에서는 이 문들을 대기 시키기 위해서  

addEventListener(MouseEvent...)
의 방법으로 이벤트를 대기 목록에 하나하나씩 추가 하게 됩니다. 이벤트를 대기 하는 메모리 공간에 자신이 추가 하고 싶은 이벤트 를 추가(add) 하는 것이지요. 반대로 이 이벤트 대기 목록에서 빼기 위한 방법으로  removeEventLister(MouseEvent...) 의 방법을 사용함니다. 더이상 이벤트가 발생하는걸 기다리지 않아도 된다는 의미 입니다.  

하지만 위의 Mouse class 에 있는 각각의 문들이 열렸다는 것은 어떻게 알수 있을까요? 내부적으로 마우스가 클릭되거나 Over 되거나 했을때 자동적으로 문이 열리기 되는 것일까요? 내부적으로 그렇게 구현되었을 수도 있겠지만, Actionscript 에서는 이벤트를 발생시키고 생성하는 매소드를 제공합니다.  이때 사용 하는 것이 dispatchEvent 입니다.  

 
dispatchEvent () 메서드  
public override function dispatchEvent(event:Event):Boolean

언어 버전 :  ActionScript 3.0
Player 버전 :  Flash Player 9

이벤트를 이벤트 흐름으로 전달합니다. 이벤트 대상은 dispatchEvent() 메서드가 호출된 EventDispatcher 객체입니다.

매개 변수

event:Event — 이벤트 흐름으로 전달된 Event 객체입니다. 이벤트를 다시 전달하는 경우, 해당 이벤트의 복제본이 자동으로 만들어집니다. 이벤트가 전달된 뒤에는 이벤트의 target 속성을 변경할 수 없으므로, 재전달에 성공하려면 이벤트의 복사본을 새로 만들어야 합니다.

반환값
Boolean — 이벤트가 성공적으로 전달된 경우 값은 true입니다. false 값은 실패를 나타내거나 해당 이벤트에서 preventDefault()가 호출되었음을 나타냅니다.

오류
SecurityError — Stage 객체의 dispatchEvent() 메서드를 호출하면 스테이지 소유자(기본 SWF 파일)와 다른 보안 샌드박스에 있는 호출자에 대해 예외가 발생합니다. 스테이지 소유자는 이와 같은 상황을 피하기 위해 Security.allowDomain() 메서드 또는 Security.allowInsecureDomain() 메서드를 호출하여 호출자 도메인에 권한을 부여할 수 있습니다. 자세한 내용은 ActionScript 3.0 프로그래밍의 "보안" 장을 참조하십시오.

 중요한건 알겠는데 어떻게 사용 되는 것인가? Actionscript 에서는 내부적으로 Mouse 가 CLICK 되었을때 발생하는 함수가 구현되어 있을것입니다. 만약 MouseCLICK 이 발생할때 실행 되는 함수가 Class Mouse 의 function CLICK ():void {} 이라면 dispatchEvent 를 사용해서 연결 시킬수 있습니다.

 

 flash.events.MouseEvent
 
  1. package flash.events{
  2.        
  3.         public class MouseEvent
  4.         {
  5.                 public static const MOUSE_OVER:String = "mouseover";
  6.                 public static const MOUSE_OUT:String = "mouseout";
  7.                 public static const CLICK:String = "click";
  8.                
  9.                 etc....
  10.                
  11.                 public function MouseEvent(type : String, bubbles : Boolean = false, cancelable : Boolean = false)
  12.                 {
  13.                         ........
  14.                        
  15.                 }
  16.                
  17.                
  18.         }
  19. }
  20.  

 

Mouse Class 안에 존재 하는 CLICK 매소드 , 이 매소드는 마우스가 클릭되면 호출된다. 하지만 이벤트를 발생 시키는

담당은 dispatchEvent 가 맡게 된다. 

 

public function CLICK():void
{

  ........................

  .......................... dispatchEvent 로 이벤트와 함수를 연결시켜주는 것 외에 다른것들도 구현되어 있을것 같습니다.
 dispatchEvent(new MouseEvent(MouseEvent.CLICK));

}

 

dispatchEvent 로 인해 CLICK 이라는 함수와 MouseEvent 의 CLICK 이라는 이벤트는 동기화가 되게 됩니다. CLICK 함수가 실행되면 '아 MouseEvent.CLICK 이벤트가 실행 되었구나 ' 하고 리스너들이 알게 되는 것입니다.

 Flash 에서의 이벤트 전달과 캐취는 이런식으로 발생하게 됩니다. 이러한 것들은 이미 Actionscript 에서 내부적으로 구현 되어 있는 것들이고, 이 원리를 이용하여 CustomEvent 를 만들수 있고, 이벤트를 좀더 유도리 있게 사용할수 있게 되는 것입니다.   

간단한 예로 마이크에서 나오는 소리를 1초 단위로 받기 위한 이벤트를 만들어 보겠습니다. 우선 SoundEvent 란 CustomEvent 를 생성하고, flash.events.Event 를 상속 받았습니다.

 

  1. package customEvent {
  2.  import flash.events.Event;
  3.  
  4.  /**
  5.   * @author dongkang
  6.  
  7.   */
  8.  public class SoundEvent extends Event {
  9.  
  10.   public static const CATCH:String = "catching";
  11.  
  12.   public function SoundEvent(type : String, bubbles : Boolean = false, cancelable : Boolean = false) {
  13.    super(type, bubbles, cancelable);
  14.   }
  15.  }
  16. }

 

이렇게 하는 것 만으로도 자신만의 커스텀 이벤트가 생성됩니다. FDT 나 Flex Builder 를 사용하시는 분들은 Event 를 상속 받는 클래스를 생성했을때 자동으로 인자값이 들어 가는것을 확인할수 있을 것입니다. 그리고 SoundEvent 의 속성으로 사용될 public static const CATCH:String = "catching"; 를 생성하였습니다. CATCH 는 SoundEvent.CATCH 와 같이 사용될 수 있는 것이고 catching 은 addEventListener("catching',함수); 와 같이 사용할수 있게 합니다. 하지만 위의 SoundEvent Class 만으로는 동작이 불가능합니다. 어떠한 일을 하는지도 모를 뿐더러 SoundEvent 라는 이름만 정의 되어 있는 Class 이기 때문입니다. 그렇다면 어떻게 ? 이 클래스에 생명을 불어 넣을수 있을까요?   

dispatchEvent 를 사용 하면 됩니다.  

  1. /* dongkang . 2008-02-23
  2. SoundGauge Class  : checking sound 0 ~ 100 */
  3.  
  4. package interactive.sound{
  5.  
  6.  import flash.events.ActivityEvent;
  7.  import flash.events.StatusEvent;
  8.  import flash.events.Event;
  9.  import flash.events.TimerEvent;
  10.  
  11.  import flash.media.Microphone;
  12.  
  13.  import flash.display.Sprite;
  14.  import flash.display.MovieClip;
  15.  
  16.  import flash.utils.Timer;
  17.  
  18.  import customEvent.SoundEvent;
  19.  
  20.  public class SoundGauge extends Sprite {
  21.   private var device_arr:Array;
  22.   public var mic:Microphone;
  23.   private var gauge:MovieClip;
  24.   private var soundtimer:Timer;
  25.  
  26.   public function SoundGauge(_gauge:MovieClip):void {
  27.    gauge = _gauge;
  28.    device_arr = Microphone.names;
  29.    mic = Microphone.getMicrophone();
  30.    mic.gain = 40;
  31.    mic.rate = 11;
  32.    mic.setUseEchoSuppression(true);
  33.    mic.setLoopBack(true);
  34.    mic.setSilenceLevel(0,10);
  35.  
  36.  
  37.    for (var i:int =0; i < device_arr.length; i++) {
  38.     trace("   " + device_arr[i]);
  39.    }
  40.    
  41.    soundtimer = new Timer(1000);
  42.    soundtimer.start();
  43.    soundtimer.addEventListener("timer",onSoundhandler);
  44.   }
  45.  
  46.   private function onSoundhandler(e:TimerEvent) : void {
  47.    dispatchEvent(new SoundEvent(SoundEvent.CATCH));
  48.   }

 

 위의 클래스는 마이크에서 받은 소리를 1초 단위로 확인하기 위한 클래스 입니다. soundtimer 는 1초 단위로 onSoundhandler를 실행 시킬 것이고, 이 함수안에는 dispatchEvent 가 있어 SoundEvent.CATCH 가 호출되었다는 사실을 1초 단위로 계속 알려주게 됩니다. 그런데 누구 한테 알려 주는 걸까요? dispatchEvent 란 의미는 자기 자신이 해당되는 Class 에 SoundEvent.CATCH 를 걸어 주겠다는 의미 입니다. 다시 말해서 SoundGauge 에 SoundEvent.CATCH 이벤트가 걸리게 됩니다. 우리는 이 이벤트를 받아 오기 위해 SoundGauge 를 생성한 함수 내부에서 받아 올수 있습니다.  

 

var sg:SoundGauge = new SoundGauge();

sg.addEventListener(SoundEvent.CATCH, onCatch);

 

function onCatch(e:SoundEvent):void

{

 이함수는 어떻게 호출 되는 걸까요?

           SoundGauge 가 생성되자 마자 내부에 있는 soundtimer가 시작되기 때문에

         이 함수 또한 1초 마다 실행 되게 됩니다.

}

 

 

이처럼 dispatchEvent 는 정말 다양하게 중요하게 사용되는 메서드 입니다.
"이벤트를 이벤트 흐름으로 전달하고, 이벤트 대상은 dispatchEvent() 매서드가 호출된 EventDispatcher 객체 입니다. 쉬운 개념이 아닌 만큼 알게 되면 그동안 힘들게 했던 이벤트 전달을 손쉽게 적용할수 있으니, 그야 말로 최강 무기 라고 할수 있습니다. Actionscript 는 이벤트가 전부다 라고 말해도 될 만큼 이벤트중심으로 코드가 짜여 있습니다. 특히 이벤트를 전달하는 개념인 dispatchEvent 를 모르고 넘어 가신다면, 좋은 아이템을 버리고 싸우러 가는 것을 의미 할 정도로 중요합니다. 

 저도 알아 가고 있는 상태라 설명이 제대로 된지 모르겠습니다. 역시 잘못된 부분은 거침없이 태클 달아 주시고요, 잘 이해 안가는 부분은 알려 주시면 더 보충하도록 하겠습니다. 금요일 입니다. 주말 잘 보내시고 곧 있을 컨퍼런스가 기대가 되네요. 



Posted by Flash 동강