SKAction, как объединить сKey и завершением
Я очень новичок в программировании на iOS и Sprite Kit и задаюсь вопросом, как объединить:
-[SKAction runAction:withKey:]
и
-[SKAction runAction:completion:]
С одной стороны, я хочу предотвратить повторное выполнение node того же действия (или последовательности действий), с другой стороны, я хочу отреагировать на завершение действия, но нет способа и, насколько я вижу, не использовать оба способа одновременно.
спасибо
Ответы
Ответ 1
Используйте +runBlock:
действие в +sequence:
следующим образом:
SKAction *yourAction = ...
SKAction *completion = [SKAction runBlock:^{
// Your code.
}];
SKAction *sequence = [SKAction sequence:@[ yourAction, completion ]];
[node runAction:sequence withKey:yourKey];
Если вы используете это несколько раз, создайте категорию SKNode
с помощью такого метода:
- (void)runAction:(SKAction *)action withKey:(NSString *)key completion:(void(^)(void))block;
Ответ 2
Это хорошее решение для Swift 2.x (обновление до Swift 3.x здесь ниже..), созданное Daniel L. Alves, используя 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 )
}
}
}
Обновить до 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
}
}
Ответ 3
Если вы хотите отреагировать на завершение действия, да, вам нужно использовать SKAction runAction:(SKAction*) completion ^{ "Your special code here" }
. Это приведет к выполнению вашего специального кода при завершении действия.
Когда вы используете SKAction runAction:(SKAction*) withKey:(NSString*)
, если у вашего действия уже есть ключ, вы можете получить действие.
Если действие с использованием того же ключа уже выполняется, оно удалено до добавления нового действия.