我需要在我的游戏中以向下角度(每次随机生成)初始释放球节点。我发现球的速度包括方向和速度(请纠正我,如果这是错误的)因此我生成一个随机角度并乘以一个值,如' 0.5'代表冲动/速度。我的代码可以在下面看到:
let minAngle : UInt32 = 181
let maxAngle : UInt32 = 359
let randomAngle = arc4random_uniform(maxAngle - minAngle) + minAngle
let dx:CGFloat = 0.5 * CGFloat(randomAngle)
let dy:CGFloat = 0.5 * CGFloat(randomAngle)
ball.physicsBody?.velocity = CGVector(dx: dx, dy: dy)
然而我意识到当球向上方向移动时,这并不起作用。我的范围是正确的还是我这样做的方法不正确?如果这是我的方法,我怎么能保证球总是以向下的角度释放(我还必须加速球的速度)?
由于
答案 0 :(得分:1)
spritekit使用弧度而非度数。更好地学习用弧度而不是度数来思考,因为那是你将要使用的东西。如果你想继续使用学位,你可以使用这种公式。
func convertToRadians(degrees: Int) -> CGFloat {
return CGFloat(M_PI) * CGFloat(degrees) / 180
}
let minAngle = convertToRadians(degrees: 181)
let maxAngle = convertToRadians(degrees: 359)
另一种计算方法
let minAngle = CGFloat(Measurement(value: 181, unit: UnitAngle.degrees).converted(to: .radians).value)
let maxAngle = CGFloat(Measurement(value: 359, unit: UnitAngle.degrees).converted(to: .radians).value)
获得两组度数之间的弧度随机角度
func random() -> CGFloat {
return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func randomDegreesToRadians(min: CGFloat, max: CGFloat) -> CGFloat {
assert(min < max)
let randomDegrees = random() * (max - min) + min
return CGFloat(M_PI) * CGFloat(randomDegrees) / 180
}
randomDegreesToRadians(min: 100, max: 200)
答案 1 :(得分:1)
您需要在角度使用SIN COS和ATAN才能到达目的地。
如果你知道你的角度和速度,你可以使用SIN和COS:
extension Int {
var degreesToRadians: Double { return Double(self) * .pi / 180 }
var radiansToDegrees: Double { return Double(self) * 180 / .pi }
}
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
归功于Leo Dabus How can I convert from degrees to radians?
let minAngle = 181.degreesToRadans
let maxAngle = 359.degreesToRadans
let randomAngle = arc4random_uniform(maxAngle - minAngle) + minAngle
let dx:CGFloat = 0.5 * cos(CGFloat(randomAngle))
let dy:CGFloat = 0.5 * sin(CGFloat(randomAngle))
ball.physicsBody?.velocity = CGVector(dx: dx, dy: dy)
如果您只知道2分,并且需要获得角度,则使用arctan2: (我们需要将point1设为我们的原点,因此我们从point1中减去point2)
let point1 = CGPoint(x:0,y:1)
let point2 = CGPoint(x:0,y:2)
let distancePoint = CGPoint(x:point2.x - point1.x, y:point2.y - point1.y)
let angle = atan2(distancePoint.y,distancePoint.x)