Cómo administrar correctamente los grupos de sprites en pantalla

Estoy construyendo mi primer juego en Swift y quería saber cómo manejar múltiples sprites de pantalla a la vez. Mi juego empuja a los sprites a la pantalla con addChild continuamente, por lo que hay muchos activos a la vez. Me di count de que no tenía una forma adecuada de afectarlos a todos simultáneamente, como si quisiera afectar una propiedad física de todos los sprites enemigos al mismo time. Hasta ahora he creado un array vacío var enemySprites = [enemyType1]() al principio de GameScene y he estado appending las instancias de sprite a él en lugar de usar addChild para dibujarlos directamente en la escena. Sin embargo, no soy capaz de simplemente recorrerlos y dibujarlos para la pantalla con:

  for enemy in enemySprites{ addChild(enemy) } 

este bit de código está en la override func update(currentTime: CFTimeInterval) , así que ¿tal vez estoy perdiéndolo? ¡Cualquier ayuda sobre cómo hacer esto sería genial!

Sam,

Aquí hay un código de ejemplo para actualizar a los enemigos cuando tus vidas alcanzan 0:

Primero, establecemos un observador de properties en la propiedad de lives para que podamos llamar a una function cuando pierdes todas las vidas:

 var lives = 3 { didSet { if lives == 0 { updateEnemies() } } 

Y luego una function para enumerar sobre todos los enemigos y cambiar la velocidad de cada uno a (0, 0):

 func update enemies() { enumerateChildNodesWithName("type1") { node, stop in let enemy = node as! SKSpriteNode enemy.physicsBody?.velocity = CGVector(dx: 0, dy: 0) } } 

En lugar de utilizar el método de update , puede usar un timer. De las fonts:

 public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer 

Entonces si sigues la guía de Apple, será por ejemplo:

 NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("spawnAlien:"), userInfo: myParameter, repeats: true) func spawnAlien(timer : NSTimer) { if let myUserInfo = timer.userInfo { print(myUserInfo) // a parameters passed to help you to the alien creation } timer.invalidate() } 

PERO según Whirlwind estoy de acuerdo con él y con LearnCocos2d , sprite-kit no funciona bien con timeres (como se explica en el enlace de LearnCocos2d ) y de la mejor manera, especialmente cuando dices que desarrollas tu primer juego, es para usar SKAction , una combinación de acciones para lograr el comportamiento similar obtenido por NSTimer .

Pienso en una function o una extensión, avíseme si funciona como se espera:

 extension SKAction { class func scheduledTimerWithTimeInterval(time:NSTimeInterval, selector: Selector, repeats:Bool)->SKAction { let call = SKAction.customActionWithDuration(0.0) { node, _ in node.performSelector(selector) } let wait = SKAction.waitForDuration(time) let seq = SKAction.sequence([wait,call]) let callSelector = repeats ? SKAction.repeatActionForever(seq) : seq return callSelector } } 

Uso :

 let spawn = SKAction.scheduledTimerWithTimeInterval(time, selector: #selector(GenericArea.spawnAlien), repeats: true) self.runAction(spawn,withKey: "spawnAlien")