2011-12-07 4 views
3

좋아, 이건 아마 액션 스크립트에 대해 이해할 수없는 아주 기본적인 것일 테지만, 이걸로는 어디에도 가지 못하는 것 같습니다.프레임 스무딩 코드

내가 ENTER_FRAME 루프의 애니메이션을 매끄럽게하기로했다 몇 가지 코드가 : 당신이 볼 수 그래서

private var m_lastTime:Number; 
private var clock_speed:Number = 5; 
    private function frameLoop(evt:Event):void 
    { 
     var currTime:int = getTimer(); 
     var deltaTime:Number = (currTime - this.m_lastTime) * 0.001; 
     this.m_lastTime = currTime; 
     //trace(deltaTime.toString() + "," + (deltaTime * clock_speed).toString()); 

     // why you no work? 
     var n:Number = clock_speed * deltaTime; 
     trace(n); 
     mcClockHand.rotation += .18;// Number(deltaTime * clock_speed); 

을, 나는 프레임 사이의 시간 델타를 계산하고, 일정한 속도로 그것을 곱 해요 . Number 값을 찾아서 출력 창으로 추적합니다. 변동은 0.14에서 0.19 사이이며 평균 0.18입니다.

클록 핸드 엠씨의 회전을 오프셋 값으로 사용하면 절대로 움직이지 않습니다. 위와 같이 상수 0.18을 사용하면 30 초당 약 1 회씩 오른쪽으로 이동합니다.

둘 다 숫자 유형이며 추적 결과 거의 동일한 값을 갖습니다. MC를 움직일 수있는 이유는 무엇입니까?

어떤 조언을 주셔서 감사합니다!

+0

int 변환 오류가 발생하는 것 같습니다. 'private var clock_speed : Number = 5;'를'private var clock_speed : Number = 5.0;'으로 변경 해보시겠습니까? –

답변

3

첫 번째 루프에서 deltaTime의 첫 번째 계산은 이 null이기 때문에 NaN이됩니다. 거기에서 코드가 숫자가 아닌 객체를 증가 시키려고합니다.

private var m_lastTime:Number = 0; 

더 나은 솔루션을 경우를 확인하는 것입니다 때 NaN이 귀하의 계산 결과 : 당신이 그것을 선언 할 때 간단한 해결책은 0m_lastTime 변수를 설정하는 것입니다.

var n:Number = clock_speed * deltaTime; 
if (isNaN(n)) n = 0; 
trace(n); 
mcClockHand.rotation += n;// Number(deltaTime * clock_speed); 
+0

아, 그래. 그래서 루프를 통해 처음으로 말하고 있습니다, m_lastTime은 deltaTime NaN을 만드는 null입니다. 그리고 나서 그것을 회전에 추가하면 IT는 NaN이됩니까? 그래서 다음에 루프를 통과 할 때, m_lastTime이 이제 실수가 되더라도 deltaTime이 이제는 실수가 되더라도 NaN + 5 == NaN 이후로 회전은 항상 NaN이됩니까? 그게 맞습니까? – LoveMeSomeCode

+0

꽤 많이 있습니다. NaN은 Number의 유효한 값이며 오류를 발생시키지 않으므로 까다로울 수 있습니다. 그러나 응용 프로그램에서 예기치 않은 동작이 발생할 수 있습니다. – Corey

1

처음 사용했을 때 m_lastTime의 초기 값이 없습니다. 선언 할 때 var를 초기화하면 var m_lastTime:Number = getTimer();이 작동합니다.

관련 문제