【问题标题】:Swift/SpriteKit - Ball node downwards angle of releaseSwift/SpriteKit - 球节点向下释放角度
【发布时间】:2017-03-28 12:35:43
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你没有使用任何角度,如果你想从极坐标转到矩形坐标,你需要使用 arctan 或 arctan2

标签: ios swift sprite-kit skspritenode skphysicsbody


【解决方案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)

【讨论】:

  • 嗨。感谢角度现在似乎在随机工作,但有时它仍然向上?我不明白为什么范围或随机生成可能不正确?
  • 不知道,当角度为0时,我们是朝上还是朝右
  • 如果我们希望你的球在屏幕上移动,这意味着 y 应该是 1,x 应该是 0。所以我们想要交换 cos 和 sin,这样 dx = sin 和 dy = cos。然后我们要问你是顺时针旋转还是逆时针旋转。如果逆时针,那么我们需要对 x 执行 -sin,因为 sin(90) = 1
  • atan2 不是arctan2xy互换了。
【解决方案2】:

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)

【讨论】:

  • 当我使用上面的第二种方法将它转换为弧度时,它给了我一个错误,说'二元运算符'-''不能应用于两个 CGFloats
  • 我有 2 个范围的“最小和最大”角度但是我无法生成随机数
  • 你想在你的两个角度之间生成一个随机角度吗?
  • 是的。我需要生成一个随机角度。我需要这个角度总是向下(因此是 181 到 359 的范围)。然后我需要将冲量添加到角度,以便球具有速度。
  • 虽然答案确实会导致随机角度,但有时会向上
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 2021-07-18
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多