2016-07-30 5 views
1

Ich habe ein Problem und ich habe keine Ahnung, wo ich anfangen soll.Random Node Location ohne Überlappung

ich zuweisen sprite1 an einen zufälligen Ort mit dem folgenden Code:

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)) 
    } 

ich dann den obigen Code noch einmal wiederholen, aber für Sprite2 wie folgt:

I zuweisen Sprite2 an einen zufälligen Ort die gleiche Art und Weise wie für Sprite 1 mit dem gleichen Code:

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)) 
    } 

ich dann den obigen Code wiederholen wieder zum 3. Mal, aber für sprite3 wie folgt:

ich dann sprite3 an einen zufälligen Ort auf die gleiche Weise wie für sprite1 zuweisen und Sprite2 mit dem gleichen Code:

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)) 
    } 

Jetzt sind hier mein Problem: Ich sicherstellen möchten, dass sprite1, Sprite2 und sprite3 NICHT am selben Ort enden. Wie kann ich das machen? Ich habe versucht, über einen Weg nachzudenken, aber ich habe keine Ahnung, wo ich anfangen soll.

Thanks :)

+0

Was ist mit Ihrem Fortschritt? –

Antwort

0

Ich schlage vor, die Schaffung einer Funktion, die den Knoten zu einem zufälligen Stelle zuweist.

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)) 
    } 
} 

Dann ist es eigentlich Randomisierung:

randomSpot(sprite1) 

Stellen Sie sicher, es nicht an der gleichen Stelle ist:

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

Und für sprite3:

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

Hinweis: Sie können es mit einer Erweiterung tun:

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)) 
     } 
    } 

} 

Und dann würden Sie es nennen:

sprite1.randomSpot() 
0

Sie benötigen eine Methode, jedes Mal, wenn Ihre vorherigen Zahlen wurden choosed zu überprüfen, diese Position Randomisierung für n gültig ist, gibt es keine Grenzen:

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 
     } 
    } 

schließlich über Ihre Positionen ich über eine elegantere Methode haben zu denken:

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 
     } 
} 

Sie können mit nur 1 Zeile pro Knoten direkt alle tun:

setPos(getRandomNum(),sprite:sprite1)