2016-04-03 6 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

2つの問題:

  • Math.atan2()は(X、Y)の順序で引数を取ります。ほとんどの言語(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

関連する問題