2016-04-03 14 views
1
self.hitBall = function(ball, x, y) { 
    var angle = Math.atan2((x - ball.centerX), (y - ball.centerY)); 
    ball.velocityY = (Math.sin(angle) * 10); 
    ball.velocityX = (Math.cos(angle) * 10); 
}; 

所以函數需要帶有centerX變量和centerY變量的球。傳入函數的x和y是x,y是球被擊中的點。我想讓球從撞到的方向移動。需要在它被擊中的角度下進行球傳播

不知道爲什麼我的代碼不工作..它的行爲非常奇怪,我用三角法不太好,所以我不太確定它爲什麼不起作用。

+0

我認爲這會更適合http://gamedev.stackexchange.com/遊戲開發。 –

+0

你說你的代碼行爲很奇怪。你可以試試這個嗎? 'Math.atan2(ball.centerY - y,ball.centerX - x)' – Nayuki

回答

1

兩個問題與您的代碼:

  • Math.atan2()採取論據(Y,X)的順序。大多數語言(Java,JavaScript,C等)都這樣做(除了Microsoft Excel和其他使用(x,y)順序的其他語言)。

  • 當你說「[使]球擊中它的角度」時,你想從球的角度減去命中點。換句話說,矢量是(ball.centerX - hitX,ball.centerY - hitY)。

因此,解決方案:

  • 解決方案1:

    var angle = Math.atan2((ball.centerY - y), (ball.centerX - x)); 
    
  • 解決方案2 - 做矢量數學無角度(相當於計算):

    var dx = ball.centerX - x; 
    var dy = ball.centerY - y; 
    var norm = Math.sqrt(dx * dx + dy * dy); 
    ball.velocityX = (dx/norm) * 10; 
    ball.velocityY = (dy/norm) * 10; 
    
+0

非常感謝你!解決方案1工作,但我不得不這樣做,就像 var angle = Math.atan2((y - ball.centerY),(x - ball.centerX)); – joe