2016-07-30 85 views
1

我遇到問題,我不知道從哪裏開始。無重疊的隨機節點位置

我用下面的代碼分配sprite1到隨機的位置:

let index2 = arc4random() % 3; 
     if index2 == 0 { 
     sqrite1.position = CGPoint(x: CGRectGetMidX(self.frame) - 100 , y: CGRectGetMidY(self.frame)) 
    } else if index2 == 1 { 
     sprite1.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
    } else if index2 == 2{ 
     sprite1.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
    } 

我然後再次重複上述碼,但對於sprite2如下:

我分配sprite2到一個隨機位置的同的方式爲子畫面1使用相同的代碼:

let index2 = arc4random() % 3; 
     if index2 == 0 { 
     sqrite2.position = CGPoint(x: CGRectGetMidX(self.frame) - 100 , y: CGRectGetMidY(self.frame)) 
    } else if index2 == 1 { 
     sprite2.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
    } else if index2 == 2{ 
     sprite2.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
    } 

我然後再次重複上述代碼的第三時間,但對於sprite3如下:

我然後分配sprite3到一個隨機位置的方式爲sprite1相同,並使用相同的代碼sprite2:

let index2 = arc4random() % 3; 
     if index2 == 0 { 
     sqrite3.position = CGPoint(x: CGRectGetMidX(self.frame) - 100 , y: CGRectGetMidY(self.frame)) 
    } else if index2 == 1 { 
     sprite3.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
    } else if index2 == 2{ 
     sprite3.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
    } 

現在,這裏是我的問題:我想確保sprite1,sprite2和sprite3不要在同一地點結束。我怎樣才能做到這一點?我試圖想辦法做到這一點,但我不知道從哪裏開始。

謝謝:)

+0

那你的進展如何? –

回答

0

我建議創建分配節點隨機點的功能。

func randomSpot(node: SKSpriteNode) { 
    let index2 = arc4random() % 3; 
    if index2 == 0 { 
     node.position = CGPoint(x: CGRectGetMidX(self.frame) - 100 , y: CGRectGetMidY(self.frame)) 
    } else if index2 == 1 { 
     node.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
    } else if index2 == 2{ 
     node.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
    } 
} 

然後實際上它隨機:

randomSpot(sprite1) 

確保它不會在同一個地點:

randomSpot(sprite2) 
while sprite2.position == sprite1.position { 
    randomSpot(sprite2) 
} 

而對於sprite3:

randomSpot(sprit3) 
while sprite3.position == sprite1.position || sprite3.position == sprite2.position { 
    randomSpot(sprite3) 
} 

注意:你可以使用擴展名:

extension SKSpriteNode { 
    func randomSpot() { 
     let index2 = arc4random() % 3; 
     if index2 == 0 { 
      self.position = CGPoint(x: CGRectGetMidX(self.parent!.frame) - 100 , y: CGRectGetMidY(self.parent!.frame)) 
     } else if index2 == 1 { 
      self.position = CGPoint(x: CGRectGetMidX(self.parent!.frame), y: CGRectGetMidY(self.parent!.frame)) 
     } else if index2 == 2{ 
      self.position = CGPoint(x: CGRectGetMidX(self.parent!.frame) + 100, y: CGRectGetMidY(self.parent!.frame)) 
     } 
    } 

} 

然後你會稱它爲:

sprite1.randomSpot() 
0

你需要一個方法來檢查每次如果你以前的號碼被選用,這是有效的n個隨機位置,沒有任何限制:

class GameScene: SKScene { 
     var positions = [UInt32]() 
     override func didMoveToView(view: SKView) { 
      let index2 = getRandomNum() 
      // do whatever you want with index2 for node1 
      ... 
      let index2 = getRandomNum() 
      // do whatever you want with index2 for node2 
     } 
     func getRandomNum() -> UInt32 { 
      var exist : Bool = false 
      var index2 : UInt32! 
      while !exist { 
       index2 = arc4random() % 3 
       if !positions.contains(index2) { 
        exist = true 
       } 
      } 
      positions.append(index2) 
      return index2 
     } 
    } 

最後你的位置,我想一個更好的方法:

func setPos(index2:UInt32, sprite:SKSpriteNode) { 
     switch index2 { 
     case 0: 
      sprite.position = CGPoint(x: CGRectGetMidX(self.frame) - 100 , y: CGRectGetMidY(self.frame)) 
     case 1: 
      sprite.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
     case 2: 
      sprite.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
     default: 
      break 
     } 
} 

您可以直接做所有每個節點只有1行:

setPos(getRandomNum(),sprite:sprite1)