Swift:计算旋转SKSpriteNode的程度,使其指向CGPoint

时间:2017-03-20 00:04:35

标签: swift sprite-kit skspritenode

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

3 个答案:

答案 0 :(得分:1)

也许,像

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))

}

答案 1 :(得分:1)

替代解决方案(这可能不适用于您),是创建一个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]

答案 2 :(得分:1)

很久以前,经过大量精力调整数学和不眠之夜后,我想出了这个功能:

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,在他的网站上有一个关于该主题的教程,帮助我为这个数学奠定了基础。