2012-08-05 87 views
3

我正在製作一款javascript遊戲,我希望敵船能夠朝指定點旋轉。然後可以從他們的角度計算他們的運動。只有在船舶位於其目標的右下方時,以下代碼才能起作用。如果船在左側,則旋轉至〜0度並在那裏抖動。在右上角持續逆時針旋轉。 我在這裏做錯了什麼?任何關於更好的方法的建議?逐漸旋轉一個對象來面對一個點?

obj.angle %= 360; 
// Calculate angle to target point 
var targetAngle = Math.atan2(obj.mode.dest.y - obj.y, obj.mode.dest.x - obj.x) * (180/Math.PI) + 90; 
// Get the difference between the current angle and the target angle 
var netAngle = Math.abs(obj.angle - targetAngle) % 360; 
// Turn in the closest direction to the target 
netAngle > 180 ? obj.angle += obj.shipType.turnSpeed : obj.angle -= obj.shipType.turnSpeed; 
if(obj.angle < 0) obj.angle += 360; 
if(obj.angle > 360) obj.angle -= 360; 

我的問題是非常相似的this one,哪個更好解釋了,但不幸的是,在C#中。

編輯:這裏是工作的代碼,任何人誰可能會發現它有用:

obj.angle %= 360; 
var targetAngle = Math.atan2(obj.mode.dest.y - obj.y, obj.mode.dest.x - obj.x) * (180/Math.PI) + 90; 
targetAngle = (targetAngle + 360) % 360; 
if(obj.angle != targetAngle) 
{ 
    var netAngle = (obj.angle - targetAngle + 360) % 360; 
    var delta = Math.min(Math.abs(netAngle - 360), netAngle, obj.shipType.turnSpeed); 
    var sign = (netAngle - 180) >= 0 ? 1 : -1; 
    obj.angle += sign * delta + 360; 
    obj.angle %= 360; 
} 

回答

1

很少改變你的代碼似乎工作:

http://jsfiddle.net/57hAk/11/

+0

這當然是在正確方向邁出的一步。但是,它仍然有一些怪癖。看看它是如何翻轉的,然後在船隻到達目標的右下角時轉回來:http://jsfiddle.net/57hAk/4/。我也注意到它一次跳到45度的目標角度,但我還沒有能夠重現這一點。 – Austen 2012-08-06 18:25:10

+0

好的,這裏是左上角從3跳到135:http://jsfiddle.net/57hAk/5/ – Austen 2012-08-06 18:38:21

+0

整理了一下並修正了過度旋轉 – tobyodavies 2012-08-07 00:09:41