2016-07-09 10 views
1

Ich versuche ein Spiel zu erstellen, bei dem es fünf verschiedene Hindernisse gibt, von denen jede Sekunde zufällig ausgewählt wird und vom oberen Bildschirmrand zum unteren Bildschirmrand bewegt wird. Dies sollte ein Hindernisfeld für den Spieler zum Navigieren schaffen. Ich bin in der Lage, das erste Hindernis auf dem Bildschirm nach unten zu bewegen, aber statt eine Sekunde später den Bildschirm herunter zu kommen, bekomme ich immer Thread 1: SIGABRT-Fehler signalisieren, obwohl ich versuche, das Problem zu beheben.SWIFT: Wie wählt man zufällig eines von 5 Hindernissen aus und führt eine Aktion aus, und wiederholt diesen Vorgang jede Sekunde?

Hier ist mein Code:

func randomize() { 
    smallMiddleObstacle.size = CGSizeMake(self.frame.width - 180, obstacleHeight) 
    smallMiddleObstacle.position = CGPointMake(self.frame.width/2, self.frame.height + smallMiddleObstacle.frame.height/4) 
    smallMiddleObstacle.color = UIColor.blueColor() 

    bigMiddleObstacle.size = CGSizeMake(self.frame.width - 100, obstacleHeight) 
    bigMiddleObstacle.position = CGPointMake(self.frame.width/2, self.frame.height + bigMiddleObstacle.frame.height/4) 
    bigMiddleObstacle.color = UIColor.blueColor() 

    rightObstacle.size = CGSizeMake(self.frame.width * 1.4, obstacleHeight) 
    rightObstacle.position = CGPointMake(self.frame.width, self.frame.height + rightObstacle.frame.height/4) 
    rightObstacle.color = UIColor.blueColor() 

    leftObstacle.size = CGSizeMake(self.frame.width * 1.4, obstacleHeight) 
    leftObstacle.position = CGPointMake(0, self.frame.height + leftObstacle.frame.height/4) 
    leftObstacle.color = UIColor.blueColor() 

    rightObstacleInPair.size = CGSizeMake(self.frame.width * 0.7, obstacleHeight) 
    rightObstacleInPair.position.x = self.frame.width 
    rightObstacleInPair.color = UIColor.blueColor() 

    obstaclePair.addChild(rightObstacleInPair) 

    leftObstacleInPair.size = CGSizeMake(self.frame.width * 0.7, obstacleHeight) 
    leftObstacleInPair.position.x = 0 
    leftObstacleInPair.color = UIColor.blueColor() 

    obstaclePair.addChild(leftObstacleInPair) 

    obstaclePair.position.y = self.frame.height + obstaclePair.frame.height/4 

    let distance = CGFloat(self.frame.height + obstacleHeight) 
    let move = SKAction.moveByX(0, y: -distance, duration: NSTimeInterval(0.005 * distance)) 
    let remove = SKAction.removeFromParent() 
    moveAndRemove = SKAction.sequence([move, remove]) 

    let random = Int(arc4random_uniform(4)) 

    if random == 0 { 
     addChild(smallMiddleObstacle) 
     smallMiddleObstacle.runAction(moveAndRemove) 
    } else if random == 1 { 
     addChild(bigMiddleObstacle) 
     bigMiddleObstacle.runAction(moveAndRemove) 
    } else if random == 2 { 
     addChild(rightObstacle) 
     rightObstacle.runAction(moveAndRemove) 
    } else if random == 3 { 
     addChild(leftObstacle) 
     leftObstacle.runAction(moveAndRemove) 
    } else { 
     addChild(obstaclePair) 
     obstaclePair.runAction(moveAndRemove) 
    } 

} 



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if !isGameStarted { 

     isGameStarted = true 


     let spawn = SKAction.runBlock({ 
     () in 

      self.randomize() 

    }) 

     let delay = SKAction.waitForDuration(1.5) 
     let spawnDelay = SKAction.sequence([spawn, delay]) 
     let spawnDelayForever = SKAction.repeatActionForever(spawnDelay) 

     self.runAction(spawnDelayForever) 



    } 



} 

Dank

+0

Wie Sie die Schritt für Schritt durch Code, welche Leitungsfehler? – Feldur

+0

Ich kann den Simulator in Ordnung, aber nach 1,5 Sekunden stürzt der Simulator ab und gibt mir diese Nachricht im Debugger: Beenden App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: 'Versuch, einen SKNode hinzuzufügen, der bereits ein Elternteil hat: < SKSpriteNode> name: '(null)' Textur: ['nil'] Position: {414, 0} Maßstab: {1.00, 1.00} Größe: {289.79998779296875, 50} Anker: {0.5, 0.5} Drehung: 0.00 ' – Aidan

+0

Can Sie identifizieren die Codezeile, die den Fehler verursacht? – Feldur

Antwort

1

Sie zu removeFromParent vergessen haben, die bereits addChild ‚s so, das zweite Mal, wenn Sie randomize Methode, um Ihren Anruf ein„ein SKNode hinzuzufügen haben attemped schon was hat ein Elternteil: "

Geben Sie zuerst eine name an Ihre Knoten, wenn Sie dies noch nicht getan haben.

Jedesmal vor Sie addChild zu machen, müssen Sie sicher sein, Sie haben es noch nicht hinzugefügt, zu wissen, was Sie tun können:

Zum Beispiel:

if let child = self.childNodeWithName(smallMiddleObstacle.name) { 
    child.removeFromParent() 
} 
+0

Tut mir leid, ich bin verwirrt, wo gebe ich diesen Code ein? – Aidan