2014-11-15 100 views
1

我试图理解,在一般的方式,如何解决使用atan/atan2和SK的zRotation时发生的翻转。SpriteKit旋转混淆

我的雨燕代码捕获鼠标按下,然后计算出当前的位置,并使用这个小功能,点击之间的角度:

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减去该角度。所以精灵旋转很长的路。

我试图了解如何解决这个问题,所以我不会一遍又一遍地犯同样的错误。

+0

'CG的向上指向零“是什么意思?您正在计算没有pi/2的两点之间的正确角度。 – 0x141E

+0

你想实现什么?将精灵旋转到触摸位置? – Stefan

+0

“向上指向零”表示SK的零点旋转是“向上”。 atan2的零转动是“正确的”。所以它们偏离了90度,或-1.57 ...拉德。 –

回答

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参数允许您检查另一种方式是否较短,如果是,则以这种方式旋转。

+0

这既是一个工作解决方案,也是我一直在寻找的“永远都会工作”的解决方案。谢谢! –

+0

@MauryMarkowitz'rotateToAngle'也有持续时间,你如何管理它?旋转手段对于不同的角度需要不同的时间,你如何计算这个时间? –

+0

我把它留在了0.2,这使得它进一步旋转变得更快 - 但这就是我想要的。 –