我试图以一般的方式理解如何解决使用 atan/atan2 和 SK 的 zRotation时发生的翻转问题。
我的 Swift 代码捕获鼠标向下,然后使用这个小函数计算当前位置和单击之间的角度:
func angleBetweenPointOne(PointOne: CGPoint, andPointTwo PointTwo: CGPoint) -> Double {
let xdiff = CDouble(PointTwo.x - PointOne.x)
let ydiff = CDouble(PointTwo.y - PointOne.y)
let rad = atan2(ydiff, xdiff)
return rad - 1.5707963268 // convert from atan's right-pointing zero to CG's up-pointing zero
}
现在我这样做:
let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)
PlayerSprite.runAction(action)
大多数情况下,它工作正常,精灵干净利落地旋转到新角度。这适用于您可能单击/触摸的大多数点。但是,如果点击与 -ve Y 轴交叉 - 即点击就在子画面下方,下一个点击就在上方,则角度不是很小,而是 360 减去角度。所以精灵旋转了很长一段路。
我试图了解如何解决这个问题,这样我就不会一遍又一遍地犯同样的错误。
替换该行
let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)
跟
let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2, shortestUnitArc:true)
正在发生的事情是,当点击穿过负 X 轴时,从 atan2() 返回的角度从"接近π
"变为"接近-π
",反之亦然。您已将其偏移了四分之一圈,因此它会显示在负 Y 轴上。π
和-π
产生相同的精灵旋转,但是当动作计算它们之间的过渡时,它会看到2π
的差异,并适当地插入中间点。
shortestUnitArc
参数允许您要求检查其他方式是否更短,如果是,则以该方式旋转。