SpriteKit 旋转混乱

Mau*_*itz 2 sprite-kit swift

我试图以一般的方式理解如何解决使用 atan/atan2 和 SK 的 zRotation 时发生的翻转。

我的 Swift 代码捕获 mouseDown,然后使用这个小函数计算当前位置和单击之间的角度:

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
}
Run Code Online (Sandbox Code Playgroud)

现在我这样做:

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)
PlayerSprite.runAction(action)
Run Code Online (Sandbox Code Playgroud)

大多数时候它工作正常,精灵干净地旋转到新角度。这适用于您可能点击/触摸的大多数点。然而,如果点击穿过 -ve Y 轴 - 即点击位于精灵下方,下一次点击位于精灵上方,则角度不是一个小角度,而是 360 减去该角度。所以精灵会旋转很远的距离。

我正在尝试了解如何解决这个问题,这样我就不会一遍又一遍地犯同样的错误。

And*_*oll 5

更换线路

\n\n
let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2, shortestUnitArc:true)\n
Run Code Online (Sandbox Code Playgroud)\n\n

发生的情况是,当点击穿过负 X 轴时,从 atan2() 返回的角度从“接近\xcf\x80”变为“接近-\xcf\x80”,反之亦然。您已将其偏移四分之一圈,因此它显示在负 Y 轴上。\xcf\x80\xc2\xa0和\xc2\xa0-\xcf\x80都产生相同的精灵旋转,但是当动作计算它们之间的过渡时,它会看到 的差异2\xcf\x80,并适当地插入中间点。

\n\n

shortestUnitArc参数允许您要求检查另一条路是否更短,如果是,则旋转该路。

\n