objective-c ios7 sprite-kit skspritenode

objective c - SKAction cómo combinar conKey y completación



objective-c ios7 (3)

Soy bastante nuevo en la programación de iOS y Sprite Kit y me pregunto cómo combinar:

-[SKAction runAction:withKey:]

y

-[SKAction runAction:completion:]

Por un lado, quiero evitar que un nodo vuelva a ejecutar la misma acción (o secuencia de acción), por el otro, quiero reaccionar a la terminación de una acción, pero no hay ningún método y, por lo que veo , no hay forma de usar ambos al mismo tiempo.

Gracias


Esta es una buena solución para Swift 2.x (actualización a Swift 3.x aquí abajo ..) creada por Daniel L. Alves, usando la extensión SKNode :

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 ) } } }

Actualizar a Swift 3.x

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 } }


Si desea reaccionar a la finalización de una acción , sí, necesita usar SKAction runAction:(SKAction*) completion ^{ "Your special code here" } . Esto ejecutará su código especial en la terminación de la acción.

Cuando use SKAction runAction:(SKAction*) withKey:(NSString*) , si su acción ya tiene una clave, puede recuperar la acción.
Si ya se está ejecutando una acción que utiliza la misma clave, se elimina antes de agregar la nueva acción.


Usa +runBlock: acción en +sequence: así:

SKAction *yourAction = ... SKAction *completion = [SKAction runBlock:^{ // Your code. }]; SKAction *sequence = [SKAction sequence:@[ yourAction, completion ]]; [node runAction:sequence withKey:yourKey];

Si usa esto varias veces, cree la categoría de SKNode con tal método:

- (void)runAction:(SKAction *)action withKey:(NSString *)key completion:(void(^)(void))block;