2016-06-07 15 views
1

Ich versuche ein Spiel zu erstellen, in dem ein Projektil in einem zufälligen Winkel gestartet wird. Um dies zu tun, muss ich in der Lage sein, zwei zufällige Int's zu generieren. Ich schaute auf einige Tutorials und kam mit dieser:Erstellen einer Zufallszahl in SpriteKit

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

Es funktionierte für eine Weile, aber jetzt stürzt es einfach ab.

Jede Hilfe wäre willkommen.

+0

Wenn es abstürzt, haben Sie wahrscheinlich noch weitere Informationen zu teilen. Wo stürzt es genau ab, was sagt die Stack-Spur? Es ist wahrscheinlich nicht direkt mit der Erstellung der Zufallszahlen zu tun, sondern etwas anderes. (Bullet fehlt ein physicsBody, oder bullet hat zum Beispiel bereits einen Elternteil). –

+0

Bei dieser Frage ging es mehr darum, zufällige Werte zu erhalten und weniger über den Absturz, Nickfalk ist wahrscheinlich richtig, dass der Absturz sowieso nicht zusammenhängt. – rebusB

+0

Es sind definitiv die Zufallszahlen, ich habe sie durch normale Intents ersetzt und es ist nicht abgestürzt. – GTG101

Antwort

3

Was ich am meisten benutze, ist arc4random_uniform(upperBound), die einen zufälligen Int zurückgibt, der von null bis upperBound -1 reicht.

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

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

Die Wahrheit über die ARC4 Funktionen: arc4random man page

GameplayKit eine nette Klasse hat die ARC4 Funktionen Verpackung: GameplayKit Randomness

und eine praktische Referenz: Random Hipster

+0

Sie sollten auch erwähnen, dass keine Modulo-Arithmetik mit arc4random verwendet wird. Es erzeugt Zahlenverteilungen, die nicht gleich sind (dh nicht zufällig). Wie auch immer :-) gute Antwort. – Fogmeister

+0

Die Verteilung des arc4random() ist nicht gleich, daher ist es nicht so, dass die Zahlen nicht zufällig sind, sondern dass einige Werte öfter angezeigt werden. Das arc4_uniform() bietet eine gleichmäßige Verteilung über seinen Bereich sowie die Notwendigkeit für die Modulo-Berechnung. – rebusB

+0

Funktioniert das mit SpriteKit? Ich bekomme Fehler. – GTG101

1

ich Sich sehr gut verstehen nicht, Problem, aber ich denke, es könnte nützlich sein:

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 ist bereits auf UInt32.max eingestellt, daher ist die Uniform nicht nötig – Knight0fDragon