2016-06-07 91 views
1

我正在嘗試創建一個遊戲,其中以任意角度發射一個子彈。 爲此,我需要能夠生成兩個隨機Int。我看了一些教程,並想出了這個:在SpriteKit中創建隨機數

var random = CGFloat(Int(arc4random()) % 1500) 
var random2 = CGFloat(Int(arc4random()) % -300) 
self.addChild(bullet) 
bullet.physicsBody!.velocity = CGVectorMake((random2), (random)) 

它工作了一段時間,但現在它只是崩潰。

任何幫助,將不勝感激。

+0

如果它崩潰了,你可能有更多的信息要分享。它在哪裏崩潰確切地說,堆棧跟蹤說什麼?這可能不是直接與隨機數字的創建,而是其他事情。 (子彈缺乏物理身體,或子彈已經有一個父母例如)。 –

+0

想象這個問題更多的是獲得隨機值而不是關於崩潰,nickfalk可能是正確的,無論如何崩潰是無關的。 – rebusB

+0

這絕對是隨機數,我用普通的Ints代替了它們,並沒有崩潰。 – GTG101

回答

3

我發現我使用最多的是arc4random_uniform(upperBound),它返回從0到upperBound -1的隨機Int。

let random = arc4random_uniform(1500) 
let random2 = arc4random_uniform(300) * -1 

//pick a number between 1 and 10 
let pick = arc4random_uniform(10)+1 

在ARC4功能的內幕:arc4random man page

GameplayKit有一個很好的類包裝的ARC4功能:GameplayKit Randomness

和方便的參考:Random Hipster

+0

你還應該提到關於不使用arc4random的模運算。它創建的數字分佈不相等(即不是隨機的)。無論如何:-)良好的答案。 – Fogmeister

+0

arc4random()的分佈是不相等的,所以它不是數字不是隨機的,而是一些值會更頻繁地出現。 arc4_uniform()在其範圍內提供了均勻的分佈,並且不需要模數計算。 – rebusB

+0

這對SpriteKit有效嗎?我收到錯誤了。 – GTG101

1

我不很瞭解你問題,但我認爲它可能是有用的:

func getRandomPointFromCircle(radius:Float, center:CGPoint) -> CGPoint { 
    let randomAngle = Float(arc4random())/Float(UInt32.max-1) * Float(M_PI) * 2.0 
    // polar => cartesian 
    let x = radius * cosf(theta) 
    let y = radius * sinf(theta) 
    return CGPointMake(CGFloat(x)+center.x,CGFloat(y)+center.y) 
} 
+1

arc4random已經被設置爲UInt32.max,所以制服並不是必需的 – Knight0fDragon