Swift SpriteKit旋转混淆

Swift SpriteKit旋转混淆,swift,sprite-kit,Swift,Sprite Kit,我试图从总体上理解如何解决在使用atan/atan2和SK的zRotation时发生的翻转 我的Swift代码捕捉鼠标向下移动,然后使用以下小功能计算当前位置与单击之间的角度: func angleBetweenPointOne(PointOne: CGPoint, andPointTwo PointTwo: CGPoint) -> Double { let xdiff = CDouble(PointTwo.x - PointOne.x) let ydiff = CDoub

我试图从总体上理解如何解决在使用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)

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

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

更换线路

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

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


shortestUnitArc
参数允许您要求检查另一个方向是否较短,如果较短,则旋转该方向。

CG向上指向零是什么意思?您正在计算没有pi/2的两点之间的正确角度。您希望实现什么?将精灵旋转到触摸位置“向上指向零”表示SK的零旋转为“向上”。atan2的零旋转是“正确的”。所以它们偏离了90度,或者-1.57。。。“拉兹,”斯蒂芬-是的,没错。假设你点击相对位置+5x+10Y,精灵旋转+30度。现在点击+25X-15Y-works great再旋转30度。...左右现在点击-75X-10Y,可能再点击90度,现在它几乎指向左边。现在点击-80X,+10Y,精灵逆时针旋转350度。你计算的角度是正确的(为了这个目的。如果你愿意,我可以解释更多)。从您的评论(您也应该使用此信息编辑问题)听起来,问题不在于节点最终指向错误的方向,而在于它有时需要花费很长的时间。这告诉我问题不在于你发布的代码,而在于你实际执行旋转的代码。
CG向上指向零是什么意思?您正在计算没有pi/2的两点之间的正确角度。您希望实现什么?将精灵旋转到触摸位置“向上指向零”表示SK的零旋转为“向上”。atan2的零旋转是“正确的”。所以它们偏离了90度,或者-1.57。。。“拉兹,”斯蒂芬-是的,没错。假设你点击相对位置+5x+10Y,精灵旋转+30度。现在点击+25X-15Y-works great再旋转30度。...左右现在点击-75X-10Y,可能再点击90度,现在它几乎指向左边。现在点击-80X,+10Y,精灵逆时针旋转350度。你计算的角度是正确的(为了这个目的。如果你愿意,我可以解释更多)。从您的评论(您也应该使用此信息编辑问题)听起来,问题不在于节点最终指向错误的方向,而在于它有时需要花费很长的时间。这告诉我问题不在于你发布的代码,而在于你用来实际执行轮换的代码。这既是一个有效的解决方案,也是我一直在寻找的“永远有效”的解决方案。谢谢@MauryMarkowitz旋转角度也有持续时间,你是如何管理的?这意味着不同角度的旋转需要不同的时间,你是如何计算这个时间的?我把它设置为0.2,这使它在进一步旋转时转得更快-但这正是我想要的。这既是一个有效的解决方案,也是我一直在寻找的“始终有效”的解决方案。谢谢@MauryMarkowitz旋转角度也有持续时间,你是如何管理的?这意味着不同角度的旋转需要不同的时间,你是如何计算这个时间的?我把它保留在0.2,这使得它在进一步旋转时转得更快-但这正是我想要的。