액션스크립트 1~2까지는 아주 쉽게 이벤트를 다룰 수 있었다...
하지만 3.0에 와서는 좀 더 세밀한 제어가 가능해졌으며 그에 따르는 코드의 줄도 늘어나게 되었다.

일반적으로 이벤트청취자를 등록하는 방법은 아래와 같다.
대상.addEventListener(이벤트 타입:String , 실행함수)

위와 같이 코드를 입력했다면 대상에서 발생하는 이벤트를 괄호()뒤에 등록되어있는 함수가 실행하도록 한다.
이벤트가 발생하면 실행할 함수(리스너)는 이벤트 타입을 받아서 처리해야한다.
function(변수:이벤트타입):반환값 여부
{
       실행문
}


가령 mc라는 무비클립에 마우스다운 이벤트가 실행하면 onDown이라는 함수를 실행하라 라고한다면,
아래의 코드와 같이 처리한다.
mc.addEventListener(MouseEvent.MOUSE_DOWN , onDown)

private function onDown( event:MouseEvent ):void
{
         trace("마우스를 눌렀다!!")
}

위의 코드를 보면 이벤트 타입이 MouseEvent.MOUSE_DOWN라고 적혀있다. 이는 사용할 이벤트의 타입이
마우스(객체)이벤트이므로 MouseEvent라는 클래스에서 사용할 이벤트 타입을 정하게 되어있다.
MOUSE_DOWN이라는 이벤트 이름은 상수로서 마우스이벤트 클래스에서 설정되어있다.
클래스와 타입을 한번에 사용하려면
"mouseDown"이라고 사용하면 편리하다.
예 )  mc.addEventListener("mouswDown" , onDown);

onDown함수를 보면 매개변수 자리에 event라는 변수를 설정하였는데 타입을 MouseEvent 로 선언하였다
이는 리스너를 호출하는 이벤트 타입을 설정하여야 하며 해당 이벤트가 발생시에 리스너가 실행하도록 되어있다.

이번에는 이벤트 리스너 해제하여 보자
이벤트 등록은 위에서 처럼 addEventListener를 사용하여 청취자(리스너)를 등록하여 명령문을 실행하였다면
이벤트 제거는 이벤트가 발생하는 부분에서 add가 아닌 remove를 하게 되면 리스너와의 연결을 끊어둔다.
 mc.removeEventListener(MouseEvent.MOUSE_DOWN , onDown);


tip) 이벤트를 핸들링하는 함수가 같은 클래스에 작성되었다면 스코프를 맞추기위해 delegate를 생략한다.
delegate는 간접적인 메서드 호출자로 new없이 바로 사용이 가능하다. 만약 클래스가 다르다면 new로 생성하여
스코프를 맞추어주어야 한다.

아래 코드는 외부에서 이벤트나 사각형 그리기 클래스를 두어 delegate한 코드이다.

package
{
 import flash.display.Sprite;
 import flash.events.MouseEvent;

 public class Delegate extends Sprite
 {
  public function Delegate()
  {
   super();
   
   var draw:Rect = new Rect();
   draw.drawRect();
   addChild( draw )
   
   var delegate:DownEvent = new DownEvent();
   this.addEventListener(MouseEvent.MOUSE_DOWN , delegate.onDown)
  }
 
 }
}

//외부에서 실행하는 이벤트처리 클래스
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.Graphics;
 
class DownEvent
{
 public function DownEvent()
 {
  super();
 }
 public function onDown( e:MouseEvent ):void
 {
  trace("Down")
 }
}

//상자그리는 클래스
class Rect extends Sprite
{
 public function Rect()
 {
  super();
 }
 public function drawRect():Graphics
 {
  var g:Graphics = this.graphics
  g.beginFill(0xFF00FF);
  g.drawRect(0,0,100,100);
  g.endFill();
  return g
 }
}

tip)  Event, TimerEvent... 등과 다르게 마우스 이벤트와 키이벤트는 디스플레이 리스트에 등록된 다른 무언가를
활용하여 이벤트를 받아 와야한다. 위에 delegate 코드에서도 클릭할 수 있는 무엇이 필요해서
Rect라는 클래스를 만들고 이를 addChild하여 디스플레이 리스트에 등록하였다.
* 디스플레이 리스트 : swf에서 화면에 그리고자 하는 객체목록과 계층구조이다.
1 : stage : 계층구조의 뿌리(root)와 같은 개념으로 화면에 표현되는 모든 객체의 계층구조를
포함하는 하나의 스테이지 객체.
2 : displayObjectContainer : 컨테이너 개념으로 자신에게 다른 객체를 담을 수 있는 그릇과 같다.
3 : displayObject : 눈에 보일 수 있는 객체



Posted by 버터백통