我有一个 rocket UIImageView,它通过NSTimer不断旋转:
rotationDegrees = rotationDegrees + 0.5
rocket.transform = CGAffineTransformMakeRotation(rotationDegrees * CGFloat(M_PI/180) )
一旦我点击屏幕,我需要它只是将其发射到特定的轨迹(我使用UIKit,没有SpriteKit,所以请不要SpriteKit建议:) 这是一张图片作为轨迹的一个例子:
我的touchesBegan()方法:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// Invalidate the timer that rotates the Rocket
rotationTimer.invalidate()
// Fire timer that moves the Rocket
moveRocketTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "moveRocket", userInfo: nil, repeats: true)
}
这里是我需要移动火箭的功能,如8点X和8点Y
func moveRocket() {
rocket.center.x = ??? + 8
rocket.center.y = ??? + 8
}
我使用NSTimer移动火箭,因为我需要使用检查其与另一个视图的碰撞,如果CGRectIntersectsRect()
提前感谢您的帮助!
答案 0 :(得分:1)
您需要使用三角学来计算x和amp;的变化。 y对于给定的角度:
y = sin(angle);
x = cos(angle);
这将为您提供从-1到1的值。您需要根据需要缩放它们(在您的问题中,您乘以8。
您的角度值必须以弧度为单位。因此,如果角度为度,您可能需要编写一个函数来将度数转换为弧度:
func radiansFromDegrees(degrees: Float) -> Float
{
return degrees * M_PI/180;
}
如果你想让你的船只移动8点/帧,你应该乘以8.这样就可以了:
rocket.center.y += 8.0 * sin(radiansFromDegrees(angle));
rocket.center.x += 8.0 * cos(radiansFromDegrees(angle));
你可能不得不做一些类型转换来使编译器满意,因为我认为sin和cos返回双倍。