2016-10-13 2 views
2

Voici mon code:boucle ne pas exécuter le code sequencially (+ rapide spritekit)

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    let origin = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 

    let delay = SKAction.waitForDuration(2.0) 

    for (var i = 0; i < 6; i++) { 
     //generate a random point on a circle centered at origin with radius of 500 
     let point = randomPointOnCircle(500, center: origin) 

     let chanceToSpawn = arc4random_uniform(100) 

     switch chanceToSpawn { 

     case 0...60: 

      self.runAction(delay){ 
       let smallBall = SKSpriteNode(imageNamed: "smallBall”) 
       self.addChild(smallBall) 
       smallBall.xScale = 0.05 
       smallBall.yScale = 0.05 
       smallBall.position = point 

       let finalDest = CGPointMake(origin.x, origin.y) 
       let moveAction = SKAction.moveTo(finalDest, duration: 5.0) 
       smallBall.runAction(SKAction.sequence([SKAction.waitForDuration(0.1), moveAction, SKAction.runBlock({ 
        smallBall.removeFromParent() 
       })])) 
       delay 
      } 

      break 

     case 61...80: 
      //same as case 0…60, smallBall changed to “mediumBall” 
      break 
     case 81...99: 
      //same as case 0…60, smallBall changed to “largeBall” 
      break 
     default: 
      break 
     } // ends switch statement 
    }//ends for loop 



}//end didMoveToView 

Fondamentalement, j'ai les boules qui se reproduisent sur un point au hasard sur un cercle et se dirigent vers le centre. Mais le problème est que peu importe comment je réarrange les choses (ou réécrire les choses, c'est-à-dire essayer différentes boucles ou définir des fonctions pour engendrer la balle et le mouvement de la balle et les appeler depuis l'instruction switch) les balles apparaissent en même temps. J'essaie de faire en sorte qu'ils se reproduisent l'un après l'autre (ce qui signifie qu'une balle se reproduit, le fil attend quelques secondes, puis génère une autre balle.), Et je n'arrive pas à comprendre pourquoi chaque balle fraye en même temps le temps comme toutes les autres balles.

Je suis assez nouveau à la programmation Swift/Spritekit et je me sens comme si je donne sur un petit détail et ce qui est vraiment me casser les pieds. Toute aide appréciée!

Répondre

1

Pour les boucles sont exécutées plus rapidement que vous le pensez! Votre boucle for est probablement exécutée instantanément.

"Pourquoi est-ce? J'ai déjà appelé self.runAction(delay) pour retarder la boucle for!" tu as demandé. Eh bien, l'action de retard ne retarde pas réellement la boucle for, malheureusement. Cela retarde simplement les autres actions que vous exécutez sur self.

Pour résoudre ce problème, essayez de retarder des quantités différentes, dependind sur le compteur pour la boucle:

self.runAction(SKAction.waitForDuration(i * 2 + 2)) { ... } 

De cette façon, les boules apparaîtront toutes les deux secondes.

+0

Il a fonctionné! Merci beaucoup! Le seul problème que j'ai rencontré je devais déclarer explicitement que la variable i était un double, mais à part ça tout fonctionne bien! Merci encore! :RÉ –

1

essayer cela, peut être dû à u en même temps les actions sont l'ajout pour chaque boules,

smallBall.runAction(SKAction.sequence([SKAction.waitForDuration(0.1 + (i * 0.35/2)), moveAction, SKAction.runBlock({ 
       smallBall.removeFromParent() 
      })])) // delay added (0.1 + (increment the daly)) 

essayer cette

0

Votre problème est que vous appelez runAction à chaque itération de votre boucle for. Cela signifie que toutes vos actions s'exécuteront simultanément.

Ce que vous voulez faire est de créer un tableau d'actions. puis après la boucle for, exécutez une séquence d'actions.

(Note: je me suis permis de nettoyer votre code)

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    let origin = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 

    let delay = SKAction.waitForDuration(2.0) 
    var sequence = [SKAction]() 
    for (var i = 0; i < 6; i++) { 
     //generate a random point on a circle centered at origin with radius of 500 
     let point = randomPointOnCircle(500, center: origin) 

     let chanceToSpawn = arc4random_uniform(100) 
     var ballname = "smallBall” 
     switch chanceToSpawn { 


     case 61...80: 
      //same as case 0…60, smallBall changed to “mediumBall” 
      ballname = "mediumBall” 

     case 81...99: 
      //same as case 0…60, smallBall changed to “largeBall” 
      ballname = "largeBall” 

     default:() 
     } // ends switch statement 

     sequence.append(delay) 
     sequence.append(
      SKAction.run() 
      { 
       [unowned self] in 
       let ball = SKSpriteNode(imageNamed: ballName) 
       self.addChild(ball) 
       ball.xScale = 0.05 
       ball.yScale = 0.05 
       ball.position = point 

       let finalDest = CGPointMake(origin.x, origin.y) 
       let moveAction = SKAction.moveTo(finalDest, duration: 5.0) 
       let briefWait = SKAction.waitForDuration(0.1) 
       let remove = SKAction.removeFromParent() 
       let moveSeq = SKAction.sequence([briefWait ,moveAction,remove]) 
       ball.runAction(moveSeq) 

      } 
     ) 
    }//ends for loop 


    self.run(SKAction.sequence(sequence)) 
}//end didMoveToView