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