【问题标题】:Swift: Calculate how much to rotate an SKSpriteNode to have it pointing at a CGPointSwift:计算旋转 SKSpriteNode 多少使其指向 CGPoint
【发布时间】:2017-03-20 00:04:34
【问题描述】:

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

【问题讨论】:

  • 查看 atan2(y, x),它会为您提供矢量 的角度。
  • 谢谢!你能告诉我向量 包含什么吗?
  • 那将是 。我不熟悉 swift,因此您必须查找确切的代码才能找到这 4 个值。 koenig-media.raywenderlich.com/uploads/2012/10/trig-lesson.png
  • 数学(或更准确地说,三角学)是你的朋友...
  • 点在什么坐标系中?场景?枪?点是否与节点相关联?

标签: swift sprite-kit skspritenode


【解决方案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,在他的网站上有一个关于该主题的教程,对我奠定数学基础很有帮助。

【讨论】:

    【解决方案2】:

    也许,像

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        相关资源
        最近更新 更多