Swift3 在SpriteKit中旋转后如何保持节点正确定向

Swift3 在SpriteKit中旋转后如何保持节点正确定向,swift3,sprite-kit,Swift3,Sprite Kit,当我试图让一条鱼在移动时自然地游向它的新点时,我遇到了一个问题 我使用递归函数不断地将每条鱼移动到屏幕上的一个新位置,在它移动之前,它应该旋转到新点相对于当前点存在的角度。然而,所有这些都是有效的,一旦它旋转,有时鱼会倒过来或倒过来。在我添加了一些语句来翻转鱼的Y比例后,如果角度在特定象限中,它会变得更好。但它仍然不完美。你知道如何确保鱼的方向正确吗 0度处的图像资源面向左侧。最初,当我读到SpriteKit的坐标系所期望的结果时,我让它朝向右边,但这并没有产生预期的结果 这都是名为move的S

当我试图让一条鱼在移动时自然地游向它的新点时,我遇到了一个问题

我使用递归函数不断地将每条鱼移动到屏幕上的一个新位置,在它移动之前,它应该旋转到新点相对于当前点存在的角度。然而,所有这些都是有效的,一旦它旋转,有时鱼会倒过来或倒过来。在我添加了一些语句来翻转鱼的Y比例后,如果角度在特定象限中,它会变得更好。但它仍然不完美。你知道如何确保鱼的方向正确吗

0度处的图像资源面向左侧。最初,当我读到SpriteKit的坐标系所期望的结果时,我让它朝向右边,但这并没有产生预期的结果

这都是名为move的SKSpriteNode扩展的一部分,因此最后是递归调用

let angle = atan2(self.position.y - newPoint.y, self.position.x - newPoint.x)
self.zRotation = angle

if angle > 0 && angle < 1.57 {
   self.yScale = abs(self.yScale)
}else if angle > 1.57 {
   self.yScale = self.yScale.negative()
}else if angle < 0 && angle > -1.57 {
   self.yScale = abs(self.yScale)
}else if angle < -1.57 {
   self.yScale = self.yScale.negative()
}

self.run(SKAction.move(to: newPoint,duration: timeToPoint),completion:{
   self.move(within: frame,withSpeed: timeToPoint,excluding: rect,isFish: isFish)
})
如果精灵向右移动,则希望精灵的yScale为正值,如果精灵向左移动,则希望其yScale为负值。如果您希望精灵向左移动并且它已经朝向左侧,即yScale已经为负数,则否定yScale将无法正常工作。在这种情况下,yScale将为正值。此外,由于角度通常很难使用,这里有另一种解决问题的方法:

let dx = self.position.x - newPoint.x
self.yScale = dx < 0 ? -abs(self.yScale) : abs(self.yScale)

负片做什么?只是一个CGFloat扩展。基本上,return self=0-self。这不是一回事吗?或者你认为我的0-self如果已经是负数的话,它会变成正数?我想这是合理的,让我想想。谢谢。YYYYEP,就是这样。我不敢相信我没有抓住双重否定的可能性。我建议将此作为您回答的理由。谢谢你,先生。
extension CGFloat {
    func negative() -> CGFloat {
        return -abs(self)
    }
}