swift sprite-kit handler skaction completion

SKAction Completion Handlers; uso en Swift



sprite-kit (3)

Encontrado un problema aquí:

spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count: 1)

Además, como sangony publicó un enlace muy bueno: resolvió la sintaxis del bloque de finalización para

spaceMan.runAction(spaceManDeathAnimation, completion: {() -> Void in println("death") })

¡Muchísimas gracias a todos por las contribuciones para una solución!

Soy nuevo en Swift y SpriteKit. Muchas de las muestras de Acciones de SpriteKit están en el Objetivo C, que no puedo asignar, ni trabajar, en Swift.

Si ejecuta un SKAction, y después de la finalización de SKAction queriendo hacer otra cosa, ¿cómo hago esto bien, en Swift?

spaceMan.runAction(spaceManDeathAnimation, completion: { println("red box has faded out") })

Cualquier idea será muy apreciada.

Editar:

for i in 0...29 { textures.append(SKTexture(imageNamed: "spaceManDeath_/(i)")) } spaceManDeathAnimation = SKAction.repeatActionForever(SKAction.animateWithTextures(textures, timePerFrame: 0.15625))


Tu código de finalización no se llama porque tu acción de "muerte" se ejecuta para siempre, lo que significa que nunca terminará.

Puedes usar

+ repeatAction:count:

método para establecer un recuento de cuántas repeticiones se realizarán antes de finalizar:

spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count:5)


En Swift puedes usar esta extensión:

extension SKNode { func runAction( action: SKAction!, withKey: String!, optionalCompletion: dispatch_block_t? ) { if let completion = optionalCompletion { let completionAction = SKAction.runBlock( completion ) let compositeAction = SKAction.sequence([ action, completionAction ]) runAction( compositeAction, withKey: withKey ) } else { runAction( action, withKey: withKey ) } } }

Use por ejemplo como:

myShip.runAction(move,withKey:"swipeMove",optionalCompletion: { //Here action is ended..do whatever you want }

Swift 3:

extension SKNode { func run(action: SKAction!, withKey: String!, optionalCompletion:((Void) -> Void)?) { if let completion = optionalCompletion { let completionAction = SKAction.run(completion) let compositeAction = SKAction.sequence([ action, completionAction ]) run(compositeAction, withKey: withKey ) } else { run( action, withKey: withKey ) } } func actionForKeyIsRunning(key: String) -> Bool { return self.action(forKey: key) != nil ? true : false } }

Uso :

myShip.runAction(action: move, withKey:"swipeMove", optionalCompletion: { //Here action is ended..do whatever you want }