2016-01-04 2 views
1

Désolé, très nouveau pour swift, et le codage en général, donc cela peut être une question débutant. J'ai actuellement le code ci-dessous en créant des flèches autour d'un cercle. Comment puis-je convertir ceci afin que toutes les flèches apparaissent une seconde après la dernière, jusqu'à ce qu'elles aient toutes été créées? Un utilisateur m'a dit dans un autre thread que cela devrait être accompli en utilisant un runBlock et une séquence SKAction.sequence, mais je ne les connais que très peu. Pourrais-je obtenir de l'aide? Merci! (:Conversion d'une boucle créatrice d'objet à un runBlock avec une attente entre la création de l'objet

override func didMoveToView(view: SKView) { 

self.spawnArrows() 

} 

func spawnArrows() { 

for var i = 0; i < 36; i++ { 

    let arrow = self.createArrow(specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10))) 
    self.addChild(arrow) 

} 
} 

func specificPointOnCircle(radius:Float, center:CGPoint, angle:Float) -> CGPoint { 

let theta = angle * Float(M_PI)/180 
let x = radius * cosf(theta) 
let y = radius * sinf(theta) 
return CGPoint(x: CGFloat(x) + center.x, y: CGFloat(y) + center.y) 

} 

func createArrow(position: CGPoint) -> SKSpriteNode { 

let arrow = SKSpriteNode(imageNamed: "Arrow.png") 
arrow.zPosition = 2 
arrow.size = CGSize(width: self.frame.size.width/2 * 0.12, height: self.frame.size.width * 0.025) 
arrow.position = position 
return arrow 

} 

Répondre

1

Vous pouvez mettre à jour votre méthode spawnArrows comme ci-dessous

func spawnArrows() { 

    var list = [SKAction]() 

    for var i = 0; i < 36; i++ { 
     let create = SKAction.runBlock { [unowned self] in 
      let arrow = self.createArrow(self.specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10))) 
      self.addChild(arrow) 
     } 
     list.append(create) 

     let wait = SKAction.waitForDuration(1) 
     list.append(wait) 
    } 

    let sequence = SKAction.sequence(list) 
    self.runAction(sequence) 
} 

Comme vous pouvez le voir maintenant, je suis en utilisant le for loop pour créer une liste des actions

  1. Le. première action ajoutée contient le code pour créer la première flèche
  2. Ensuite, il y a un ac tion à attendre 1 seconde
  3. ensuite l'action pour ajouter la deuxième flèche
  4. Et ainsi de suite ...

Après la for loop ne se termine, la liste des actions se transforme en un sequence et finalement exécuté. Faites-moi savoir si cela fonctionne.

+0

Merci, cela fonctionne aussi loin qu'un délai d'attente entre la création des flèches! Ils ne sont plus créés autour du cercle, mais ils viennent seulement du côté droit de l'écran. J'imagine que je peux résoudre ce problème en définissant une variable globale pour l'angle et en l'ajoutant dans la boucle for avec une manipulation de la variable – dulongj

+1

Ahh oui je viens de changer l'angle de (i + 10) à une variable globale de i . Merci beaucoup pour votre aide! – dulongj

+0

@appzYourLife Vous ne savez pas si vous l'avez volontairement laissé pour des raisons de simplicité, mais en utilisant un auto comme celui-ci, vous créez un cycle de référence fort et utilisez SKAction.runBlock {[unowned self] dans/* faites vos affaires ici * /} ou en supprimant toutes les actions de la méthode willMoveFromView de la scène, cela empêchera que cela se produise. – Whirlwind