2014-06-23 110 views
-1

所以我正在製作一個使用canvas API的小遊戲,而且我對Javascript還是比較新的。但是,當我正在做的性格特徵能在我下面的代碼跨錯誤來了一個360度的拍攝(這個功能應該返回鼠標位置和球員的位置沒有別的之間的夾角)javascript typeof/NaN混淆

calculateAngle : function(x,y){ 

    var opp = 0; //opposite 
    var adj = 0; //adjecent 
    var rad = 0; //radian 
    var ang = 0; //angle 

    //side lengths 
    var x1 = gfx.player_center_x //the player x position 
    var x2 = mouse_x; //the mouse x position 
    var y1 = gfx.player_center_y; //the player y position 
    var y2 = mouse_y; //the mouse y position 

    //find 2 lengths of the triangle 
    opp = (y2 - y1); 
    adj = (x2 - x1); 

    //find the missing angle between the adjecent and hypotenuse 
    rad = Math.atan2(adj, opp); 
    ang = rad * 180/Math.PI; 

    //-------------------------// 
    console.log(ang); //prints: NaN 
    console.log(typeof ang); //prints: number 
    //------------------------// 

    return ang; 
} 

當執行它返回NaN但ang是一個數字! 爲什麼javascript認爲變量ang不是數字?它聲明爲0哪種類型的返回數字,請幫忙!

UPDATE:由粗心的錯誤,X1和Y1 ECT改變了位置,我忘了實現它,感謝您的回答雖然

+0

你從哪裏得到'mouse_x'和'mouse_y'? – Steve

+1

變量沒有類型。 'ang'不一定是一個數字 - 它最初存儲一個數字('0')......'typeof'表示是一個數字。 'NaN'表示'ang'的最近值(計算)的結果被確定爲不是數字。計算確定它不是一個數字,所以它返回'NaN'。看着這個計算('rad * 180/Math.PI'),我假設用'rad'有一個「問題」,以便使計算出錯 – Ian

+1

rad可能是NaN – juvian

回答

0

NaN的是一個特殊值。它在內部是一個數字,但它是一個特定的值,賦予「這個數值在數學上未定義」的特殊含義。任何導致未定義數字的操作(如0/0)都會導致NaN,但它仍然是一個數字!只是不是一個定義的數字。

Math.atan2以這樣一種方式,它不能返回NaN(因爲它處理了「邊緣情況」,其中y/xInfinity - 另一個「數量」這不是一個定義的號碼)被實現,因此幾乎可以肯定,你的NaN來自opp和/或adj的計算。你應該記錄這些值,看看發生了什麼。

+0

由於opp/adj來自x1,x2,y1和y2,所以字符和/或鼠標位置的計算方式很可能是問題。也許他試圖用CSS來獲得角色的位置,導致問題。我建議將角色的位置存儲在變量中,而不是嘗試訪問DOM中的值。 – tomysshadow