2014-11-15 141 views
1

我試圖理解,在一般的方式,如何解決使用atan/atan2和SK的zRotation時發生的翻轉。SpriteKit旋轉混淆

我的雨燕代碼捕獲鼠標按下,然後計算出當前的位置,並使用這個小功能,點擊之間的角度:

func angleBetweenPointOne(PointOne: CGPoint, andPointTwo PointTwo: CGPoint) -> Double { 
    let xdiff = CDouble(PointTwo.x - PointOne.x) 
    let ydiff = CDouble(PointTwo.y - PointOne.y) 
    let rad = atan2(ydiff, xdiff) 
    return rad - 1.5707963268  // convert from atan's right-pointing zero to CG's up-pointing zero 
} 

現在我這樣做:

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2) 
PlayerSprite.runAction(action) 

大部分時間它工作正常,精靈乾淨地旋轉到新的角度。這適用於您可能點擊/觸摸的大多數點。但是,如果咔嗒聲與-ve Y軸交叉 - 即咔嗒聲正好在精靈之下,而下一個恰好在上方,則該角度不是小的,而是360減去該角度。所以精靈旋轉很長的路。

我試圖瞭解如何解決這個問題,所以我不會一遍又一遍地犯同樣的錯誤。

+0

'CG的向上指向零「是什麼意思?您正在計算沒有pi/2的兩點之間的正確角度。 – 0x141E

+0

你想實現什麼?將精靈旋轉到觸摸位置? – Stefan

+0

「向上指向零」表示SK的零點旋轉是「向上」。 atan2的零轉動是「正確的」。所以它們偏離了90度,或-1.57 ...拉德。 –

回答

4

替換行

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2) 

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2, shortestUnitArc:true) 

發生了什麼事是,當點擊交叉負X軸,角度ATAN2()更改返回從「東西接近π 「到」接近的東西「,反之亦然。你已經抵消了這個四分之一轉,所以它顯示在負Y軸上。 π都產生相同的精靈旋轉,但是當動作計算它們之間的轉換時,它會看到差異,並適當插入中間點。

shortestUnitArc參數允許您檢查另一種方式是否較短,如果是,則以這種方式旋轉。

+0

這既是一個工作解決方案,也是我一直在尋找的「永遠都會工作」的解決方案。謝謝! –

+0

@MauryMarkowitz'rotateToAngle'也有持續時間,你如何管理它?旋轉手段對於不同的角度需要不同的時間,你如何計算這個時間? –

+0

我把它留在了0.2,這使得它進一步旋轉變得更快 - 但這就是我想要的。 –