무언가 만들기 위한 지식/Action Script

onEnterFrame과 setInterval에 대한 고찰

신럭키 2010. 2. 24. 13:19

[1. onEnterFrame]

onEnterFrame은 예전에도 언급했듯이 프래임을 하나씩 이동하는 동안 실행시킬때 사용된다. 즉 이것을 이용하면 자유롭게 움직이는 어떤 객체도 논리적, 수식적으로 표현/구현할 수 있다. 그리고 보다 자연스러운 표현이 가능하면 숫자로 부드러운 느낌으로 조작이 가능하다. 플래쉬의 간단한 인터페이스로하다보면 시간이 오래걸리고 시각적으로 부담스러워서 수치 즉 액션스크립트로 만드는 것이 훨씬 효율적이다.

onEnterFrame을 사용할떄 가장 서민적이고 많이 쓰이는 코드는 다음이다.
x+=(20-x)*speed;
이다. speed는 속도를 말하며 보통 0.2~0.8사이의 값을 사용한다.(1보다 작아야함) 이것을 풀면
x=x+(20-x)*speed 이고 이것을 생각해보면 결국 x좌표로 20만큼의 이동을 한다는 것이다.
그런데 여기서 문제가 생긴다.
이식은 결국 x가 20이 되면 더이상의 움직임을 하지 않게 된다.
하지만 20이 딱 되지는 않고 결국에는 20에 무한대로 가까워진다.
이에 부동소수점 아래 자리수로 무수히 내려가게 되고 컴퓨터는 이 연산에 부담을 느끼며 처리속도에 영향을 받게 된다.(눈에 띄지는 않음)
그리하여 종료시 delete를 하지 않으면 계속 작동하여 프로세서를 괴롭히고 부담을 준다.
이에 간단한 해결책이있다.
delete는 버릇처럼 하는 것을 일단 당연하고
다른 것은 각 프래임에서 연산할때마다 반올림하여 계산하는 것이다.
비록 한줄이 더 실행되는 하지만 아래처럼 사용한다면
깔끔하게 부담을 주지 않고 사용될 것이다.

this.onEnterFrame=function()
{
        if(Math.round(this.sh._x)==20)
        {
                this.sh._x=20;
                delete(this.onEnterFrame);
        }
        this.sh._x+=(20.1-this.sh._x)*0.4;
}

[2. setInterval]
setInterval은 특정한 시간을 간격으로 설정한 함수를 호출하는 것이다.
ms속도에 반응하기 때문에 프래임(onEnterFrame)과는 연관없이 독립적이며
확실한 움직임을 나타낼 수 있다. 단 사용자의 컴퓨터의 초속도로 계산한다.(사실 그건 별문제 없다.)

function slide(){
        moveX+=-165;
        if(moveX!=1815)
        {
                _root.center.movingpicture.mask.gotoAndPlay(1);                
        }
        updateAfterEvent(); //이벤트 발생후 업데이트함.
}

id=setInterval(slide,2000);

위가 사용 예이다. ms단위로 1000이 1초고 2000이 ㅈ초다.
즉 2초마다 slide라는 함수를 계속하여 호출한다.
id, 즉 return값은 사용해도 되고 사용하지 않아도 된다.
id의 값은 처음에 1을 반환하고 계속 실행될수록 값이 증가하였다.
id의 값은 나중에 clearInterval()의 파라메터로 사용되기 위해 주어진다.
대걔 id의 값을 확인하여 null값이 아니면 clearInterval()하는 스타일로 가게 된다.

clearInterval( id값);
을 이용하면 반복 함수호출을 정지할 수 있다.
중요한 것은 이 clearInterval을 제대로 하지 않을 경우에 심각한 현상이 일어난다.
나같은 경우 클리어인터벌 호출후 다른 Frame으로 이동하는 상황이었는데
다시 클리어인터벌이 있는 Frame으로 넘어서 오면 2초마다 발생해야할 속도가
더 빨라진다.
그래서 다른 Frame으로 gotoAndPlay시에 clearInterval을 같이 써줘야
속도가 달라지는 에러가 발생하지 않았다.

결국 중요한건 사용후 마무리라는 것이다.
delete나 clearInterval이나 ^^

※ 몇초후 시간별로 이벤트 발생하게 하는 것은 onEnterFrame을 이용하여,
count를 해가며 나머지(%) 연산을 통해서도 가능하다.(가끔 나도 쓴다.)