2014-08-31 72 views
2

所以我需要從圓周上的隨機點產生遊戲敵人。這是代碼我到目前爲止這感覺非常接近的工作,但不是:如何將節點定位到Sprite Kit中的圓周上的隨機點?

let enemy = SKShapeNode(circleOfRadius: 5) 

func enemyGenerator() { 

//takes an x value and calculates the corresponding y coordinate on the circle. 
    func enemyYSpawnPosition(x: CGFloat) -> CGFloat { 
     return sqrt(104006.25 - (x * x)) 
    } 

//randomly selects an x value from a range of acceptable values. 
    func enemyXSpawnPosition() -> CGFloat { 
     func randRange (lower: Int , upper: Int) -> Int { 
      return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) 
     } 
     var xValue = randRange(-2.5, 322.5) 
     return CGFloat (xValue) 
    } 

//used to randomly decide whether the y value will be subtracted or added. 
    func coinFlip (lower: Int, upper: Int) -> Int { 
     return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) 
    } 
    var randResult = coinFlip(1, 2) 

//positions the enemy using the functions above. 
    if randResult == 1 { 
     self.enemy.position = CGPointMake(enemyXSpawnPosition(), CGRectGetMidY(self.frame) + enemyYSpawnPosition(enemyXSpawnPosition())) 
    } 
    else { 
     self.enemy.position = CGPointMake(enemyXSpawnPosition(), CGRectGetMidY(self.frame) - enemyYSpawnPosition(enemyXSpawnPosition())) 
    } 
} 

的問題是定位敵人的時候,我必須調用兩次enemyXSpawnPosition功能,當我這樣做,我得到兩個不同的值。當我佈置職位時,我需要保持相同的值。

是否有一種更簡單的方法將節點隨機放置在圓周上或者是他們解決現有問題的方法?

+2

如果您使用極座標,這不會更容易嗎? – pjs 2014-08-31 04:00:34

+0

這似乎是從我讀過的有用的建議。我不知道如何使用極座標。你能指導我什麼地方幫助我學習,或者你能自己展示他們的用途嗎?謝謝! – 2014-08-31 04:10:39

回答

13

該方法在給定圓的半徑和中心位置的圓上返回一個隨機點。

func randomPointOnCircle(radius:Float, center:CGPoint) -> CGPoint { 
    // Random angle in [0, 2*pi] 
    let theta = Float(arc4random_uniform(UInt32.max))/Float(UInt32.max-1) * Float.pi * 2.0 
    // Convert polar to cartesian 
    let x = radius * cos(theta) 
    let y = radius * sin(theta) 
    return CGPointMake(CGFloat(x)+center.x,CGFloat(y)+center.y) 
} 
+0

這個技巧。非常感謝! – 2014-08-31 17:52:58

相關問題