Swift / SpriteKit - Ball节点向下释放角度

时间:2016-11-14 19:11:10

标签: ios swift sprite-kit skspritenode skphysicsbody

我需要在我的游戏中以向下角度(每次随机生成)初始释放球节点。我发现球的速度包括方向和速度(请纠正我,如果这是错误的)因此我生成一个随机角度并乘以一个值,如' 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)

然而我意识到当球向上方向移动时,这并不起作用。我的范围是正确的还是我这样做的方法不正确?如果这是我的方法,我怎么能保证球总是以向下的角度释放(我还必须加速球的速度)?

由于

2 个答案:

答案 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)