어떠한 작업을 시간에 따라 반복하고자 할 때 사용한다.

1) EnterFrame
엔터프레임 이벤트는 as1에서 아주 많이 사용하는 기능 중에 하나이다. 이 엔터프레임은 무비의 fps에 영향을 받아 무비의 실행횟수에 따라 이벤트가 발생하고 그에 따르는 명령문을 호출하여 실행하도록 한다.

예를 들어 현재 무비에 EnterFrame이벤트를 등록하고 이를 보고있는 청취자를 실행하는 코드를 구현하면 다음과 같다. (청취자 등록과 이벤트등록 및 삭제는 앞서 다루어본 이벤트 핸들링을 참고하면 된다.)

this.addEventListener(Event.ENTER_FRAME , onEnter)
private function onEnter( e:Event ):void
{
     trace("run")
}
위 코드의 실행결과는 output패널에 "run"이라는 문자열이 계속해서 출력하게 된다.
실행주기는 무비의 fps에 영향을 받아 가령 30fps라면 함수 onEnter는 1초에 30번을 호출받게 된다.

일정 횟수 후에 함수의 연결을 끊어서 실행을 중지하고 싶으며 아래와 같이 조건을 두어 코딩하면 된다.
var a:int = 1;
this.addEventListener(Event.ENTER_FRAME , onEnter);

function onEnter( e:Event ):void {
 if (a <= 100) {
  trace(a,"번 실행");
  a++;
 } else {
  this.removeEventListener(Event.ENTER_FRAME , onEnter);
 }
}

위의 코드를 보면 무비의 enterFrame이벤트를 바라보는 onEnter라는 함수는 이벤트가 발생하면 호출되어
실행하며 함수의 실행문 안에 조건문을 두어 실행과 이벤트연결을 제거하도록 되어있다.
a의 값이 100 이하일 때는 a를 1씩 증가시키며 자신의 코드블럭을 실행하고 100을 넘는 순간 이벤트와의 연결고리를 끊어서 무비에서 아무리 enterFrame이 발생하여도 이제는 onEnter라는 함수는 실행하지 않도록 하였다.

tip) 무비의 렌더링과 실행에 관여하는 fps(재생속도)조절방법
기본적으로 무비에서 제공하는 properties를 사용하여 수치를 바꿀 수 도 있지만
this.stage.frameRate = 30;
와 같이 무비의 절대적인 최상위인 stage클래스에 접근하여 frameRate 를 바꾸어 줄 수도있다

2) Timer
타이머클래스는 타이머이벤트와 같이 사용하며 AS3에서 처음으로 등장하게 되었다.
이 타이머는 무비의 재생속도와 관련없이 독자적인 재생시간을 가질 수 있다. 가령 무비의 fps가 30인데
특정 Timer는 2(2000밀리세컨드)초에 한번 실행하거나 1(1000밀리세컨드)초에 2번 실행하도록 실행타임을 설정할 수 있다.

Timer클래스에는 delay(지연시간)과 repeatCount(실행횟수)라는 속성이 포함되어있다.
Timer클래스를 사용하기 위해서는 Timer에 TimerEvent를 걸어두고 Timer클래스의 start()를 실행하여야 한다.
필요에 따라서 타이머를 중단하고 싶을 때는 stop()이라는 메서드와 타이머를 초기화 하는 reset()이라는 메서드도 기억해 두자.

var a:int = 1;
var timer:Timer = new Timer(1000,5)
timer.addEventListener(TimerEvent.TIMER , onTimer);
timer.start(); // 이때부터 타이머가 실행되며 이벤트에 의해 청취자 함수가 따라 실행한다.

function onTimer( e:TimerEvent ):void {
 trace(a,"번 실행"); //출력 : 1 번 실행 , 2 번 실행~ 5 번 실행
 a++;
}

위의 코드는 1초에 한번씩 onTime라는 함수가 호출되어 실행하고 repeatConut가 5이므로 5번 실행후 타이머는 종료된다.

위와 같은 경우에는 실행횟수를 설정한 것이고 enterFrame처럼 지속적인 실행을 하고 싶다면 repeatConut를
0으로 설정하면 된다.
var a:int = 1;
var timer:Timer = new Timer(1000,0)
timer.addEventListener(TimerEvent.TIMER , onTimer);
timer.start(); // 이때부터 타이머가 실행되며 이벤트에 의해 청취자 함수가 따라 실행한다.

function onTimer( e:TimerEvent ):void {
 trace(a,"번 실행");
 a++;
}


마찬가지로 위와 같은 경우에 실행함수에 조건문을 추가하여 실행을 중다하고 할때는
timer.removeEventListener(TimerEvent.TIMER , onTimer);
이벤트를 제거하거나
timer.stop()
타이머를 정지시켜서 실행을 중단한다.

* 타이머를 정시키는 경우에는 아직 이벤트가 연결되어있으므로 언제든지 다시 start()를 통하여 실행을
  재개할 수 있다.

* 타이머의 발생시간/지연시간 delay를 10밀리세컨드 이하로 설정하게 되면 때로는 정확한 타임에 실행되지 않을수 있다. 이는 cpu나 실행환경에 영향을 받으므로 너무 빠르게 실행한다면 정확한 값을 얻을수 있는 경우가 발생할 수 도 있다.

Posted by 버터백통