2013-04-02 2 views
0

플래시가 처음인데 내 코드에서 버그를 찾을 수 없습니다. 나는 우주선이 벡터 속에서 가속 할 수 있고 최대 속도 이상으로 가속 할 수 없으며 가속을 멈추었지만 마찰 (공간 먼지)으로 고통받는 속도 벡터를 유지하기를 원한다. (그것은 2 차원 단계에서 발생합니다.)공간 이동 버그 FLASH

내 수학이 올바른 생각,하지만 난 가끔 velVector 이 NaN을 반환 버그를 얻을 수는 - 여기 내 코드입니다 :

var friction:Number = .96; 
var force:Number = .1; 
var maxVel:Number = 3; 
var accVector:Object = new Object(); 
var velVector:Object = new Object(); 
var velocity:Number; 
var acceleration:Number; 

에서 선박 지점의 경우 오른쪽 방향에서는 'accelerate'함수를 실행하고 그렇지 않으면 'drift'함수를 실행합니다. 항상 '이동성'을 수행합니다.

function accelerate():void { 
    curRotation.vx = Math.cos(rotation/180*Math.PI); 
    curRotation.vy = Math.sin(rotation/180*Math.PI); 

    var angle:Number = Math.atan2(curRotation.vy, curRotation.vx); 

    velocity = Math.sqrt(velVector.vx^2 + velVector.vy^2); //get velocity in both directions 
    acceleration = (maxVel - velocity)/maxVel*force; //this is to make it harder to accelerate when it approaches maxvelocity 

    accVector.vx = Math.cos(angle) * acceleration; //accelerate in each dimension 
    accVector.vy = Math.sin(angle) * acceleration; 

    velVector.vx += accVector.vx; //add acceleration to velocity 
    velVector.vy += accVector.vy; 
} 

function drift():void { 
    velVector.vx *= friction; //decrease velocity when not accelerating 
    velVector.vy *= friction;  
} 

function moveShip():void { 
    trace("velocity", velocity) 
    x += velVector.vx; //move 
    y += velVector.vy; 
} 

많은 감사!

+0

'angle' 변수는 숫자 유형이지만 소문자 "n"을 부여했습니다. 실제 코드에도 이와 동일한 실수가 있습니까? –

+0

아니요. 죄송합니다. – user2237931

+1

^2을 사용할 수 있는지 몰랐습니다. (직접 시도했습니다.) 그러나 그것은 "5^2"가 25가 아닌 7과 같기 때문에 원하는 것처럼 보이지 않습니다. – mitim

답변

0

당신의 문제는 값 유효성 검사없이 안전하지 않은 수학 연산을 사용하는 것입니다. 따라서 귀하의 velVector는 가속에 의존하는 accVector에 의존합니다. "가속도"를 계산하는 나눗셈 연산이 있습니다. AS3에서 당신은 0으로 나눌 수 있습니다

acceleration = (maxVel - velocity)/maxVel*force; 

, 당신은 이러한 상황에서 무한대를 얻을 수 있습니다 : 그게 다야. 그러나, 당신은 0으로 제로를 분할하는 경우 NaN이 얻을 수있는 기회도 있습니다 :

var acceleration:Number = 0/0; 
trace(acceleration); //NaN 

당신이 NaN의 수 또는 유형이 지정되지 않은 변수 (INT하지!), 당신은 거의 결과를 서면으로 일을하려고하면 항상 NaN이 얻을 :

acceleration = 0/0; //NaN 

accVector.vx = Math.cos(angle) * acceleration; //NaN regardless on "angel" value 

velVector.vx += accVector.vx; //NaN regardless on "velVector" value. 

나는 희망이 도움이됩니다

var a:Number = 5 * NaN; 
trace(a); //NaN 

그래서, 여기 NaN의 기능을 제공하는 예이다.

+0

실제로 도움이되었습니다. 감사! 나는 결코 0으로 나눌 수없고 또한^2를 x * x로 바꿀 수 있도록 조정했다. 의도 한대로 작동합니다.) – user2237931

관련 문제