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;