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
Wie Sie die Schritt für Schritt durch Code, welche Leitungsfehler? – Feldur
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
Can Sie identifizieren die Codezeile, die den Fehler verursacht? – Feldur