我正在基于射击太空岩石在Playgrounds制作一个SpriteKit游戏。在游戏中,有一个枪,这是一个SKSpriteNode,我希望它转向我传递给函数(CGPoint)的点。我想知道的是我如何计算将枪转向面对给定点的程度?提前谢谢!
答案 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,在他的网站上有一个关于该主题的教程,帮助我为这个数学奠定了基础。