SpriteKit旋转混乱

时间:2014-11-15 17:35:28

标签: swift sprite-kit

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

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

现在我这样做:

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)
PlayerSprite.runAction(action)

大部分时间它工作正常,精灵干净地旋转到新的角度。这适用于您可能单击/触摸的大多数点。但是,如果咔嗒声穿过-ve Y轴 - 即咔嗒声恰好位于精灵下方而下一个正好在上方,则角度不是小的,而是360减去角度。所以精灵旋转很长。

我正在努力理解如何解决这个问题,所以我不会一遍又一遍地犯同样的错误。

1 个答案:

答案 0 :(得分:4)

替换

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2)

let action = SKAction.rotateToAngle(CGFloat(angle), duration:0.2, shortestUnitArc:true)

当点击穿过负X轴时,从atan2()返回的角度从“接近π”变为“接近”或“副”反之亦然。你已将此偏移了四分之一圈,因此它显示在负Y轴上。 π都会产生与精灵相同的旋转,但当动作计算它们之间的过渡时,它会看到的差异,并适当地插入中间点。

shortestUnitArc参数允许您检查其他方式是否更短,如果是,则以此方式旋转。