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

时间:2017-03-27 16:10:41

标签: swift3 sprite-kit

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

我正在使用递归函数不断地将每条鱼移动到屏幕上的新位置,在它移动之前它应该旋转到新点相对于其当前点存在的角度。然而,所有这些都有效,一旦它旋转,鱼有时是颠倒或向后。在一些陈述之后,如果角度在特定的象限中,我添加了翻转鱼的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)
})

1 个答案:

答案 0 :(得分:1)

如果精灵向右移动,你希望精灵的yScale为正,如果精灵向左移动则为负。如果您希望精灵向左移动并且它已经面向左侧(即yScale已经为负),则否定yScale无法正常工作。在这种情况下,yScale将是正面的。此外,由于角度通常难以使​​用,这是解决问题的另一种方法:

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

或使用现有代码并将扩展名更改为

extension CGFloat {
    func negative() -> CGFloat {
        return -abs(self)
    }
}