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