Swift: 计算将 SKSpriteNode 旋转多少度使其指向 CGPoint

Swift: Calculate how much to rotate an SKSpriteNode to have it pointing at a CGPoint

我正在基于射击 space 岩石在 Playgrounds 中制作 SpriteKit 游戏。在游戏中,有一把枪,它是一个 SKSpriteNode,我希望它转向我传递给函数(CGPoint)的点。我想知道的是如何计算将枪转向给定点的多少?提前致谢!

也许吧,像

func aim(node:SKSpriteNode, point:CGPoint){

    let angle = atan2(point.y - node.position.y, point.x - node.position.x)

    node.run(SKAction.rotate(byAngle: angle, duration: 0.5))

}

另一种解决方案(这可能不适用于您)是创建一个 SKNode(可能称为 target)然后设置一个 SKContraint 以便您的 gun 总是面向 target。然后你可以在需要时将目标移动到你想让枪面向的任何地方,枪就会相应地转动。

let gun = SKNSpritenode...
let target = SKNode...

let orientRange = SKRange(lowerLimit: 0.0, upperLimit: 0.0)
let orientConstraint = SKConstraint.orientToNode(target, offset: orientRange)
gun.constraints = [orientConstraint]

很久以前,经过大量的脑力调整数学和一个不眠之夜,我想出了这个函数:

func gunAngle(gunPosition: CGPoint, targetPosition: CGPoint) -> CGFloat {
    let deltaX = Float(targetPosition.x - gunPosition.x)
    let deltaY = Float(targetPosition.y - gunPosition.y)
    let pi = CGFloat(M_PI)
    let angle = CGFloat(atan2f(deltaY, deltaX))
    var newAngle = angle

    if angle < (-pi / 2) {
        newAngle += 2 * pi
    }
return newAngle - pi/2  // Subtracting 90 degrees out of the resulting angle, as in SpriteKit 0 degrees faces left, unless you rotate your gun in the sprite accordingly
}

我意识到这可能不是最好的方法,但它对我有用。一些数学大师可能会在这里想出一些非常棒的东西。我还不是其中任何一个。

感谢 Ray Wenderlich,在他的网站上有一个关于该主题的教程,对我奠定该数学基础有很大帮助。