2015-10-06 28 views
0

我的場景設置場景>世界:sknode>相機:sknode>船:SKSpriteNode轉換點後爲什麼需要調整?

我想船指向觸摸的位置:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touchLocation = touch.locationInNode(self) 
    let location  = cameraNode.convertPoint(touchLocation, toNode: world) 


    moveCameraNode(CGPointsToVector(location, b: cameraNode.position)) 

    let shipTouchPosition = scene?.convertPoint(touchLocation, fromNode: world) 
    let shipPosition  = scene?.convertPoint(ship.position, fromNode: world) 

    let angle = atan2(shipTouchPosition!.y - shipPosition!.y, shipTouchPosition!.x - shipPosition!.x) 

    let magicNumber = CGFloat(M_PI_2) 
    ship.runAction(SKAction.rotateToAngle(angle - magicNumber, duration: 0.1, shortestUnitArc: true)) 
} 

override func didFinishUpdate() { 
    centerOnNode(cameraNode) 
} 

func centerOnNode(node: SKNode) { 
    let cameraPositionInScene = node.scene?.convertPoint(node.position, fromNode: node.parent!) 
    node.parent!.position = CGPointsSubtract(node.parent!.position, b: cameraPositionInScene!) 
} 

所以,現在它工作正常,但我不知道爲什麼我需要的magicNumber.

編輯:感謝@mundi捕對我而言這是模糊我的真實的我在做什麼錯c​​onvertPoint問題一個愚蠢的錯誤,我要事後進行調整。

回答

2

角度以弧度計算。 360度是恆定PI的2倍,或者是2 * M_PI。在SpriteKit中,角度計算從右側中心(相當於3點鐘)開始,對應於90度或半個PI,M_PI_2

80以弧度讀取評估爲1.46018,這非常接近M_PI_21.57079。這就是爲什麼這個數字似乎「神奇地」修復了這種差異,即使它稍微偏離了。真正的「魔術」號碼是CGFloat(M_PI_2)

+0

謝謝,我誤解並認爲'zRotation'和'atan2'是度數。這就是爲什麼當我第一次嘗試90時,它不起作用,但80年,這是非常接近的工作,我認爲這是一個「神奇的數字」。但我真正的問題是我爲什麼需要調整。 – MCB

+0

對。我認爲真正的問題也得到了回答。 – Mundi

相關問題