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
}