Подтвердить что ты не робот

SKAction, как объединить сKey и завершением

Я очень новичок в программировании на iOS и Sprite Kit и задаюсь вопросом, как объединить:

-[SKAction runAction:withKey:]

и

-[SKAction runAction:completion:]

С одной стороны, я хочу предотвратить повторное выполнение node того же действия (или последовательности действий), с другой стороны, я хочу отреагировать на завершение действия, но нет способа и, насколько я вижу, не использовать оба способа одновременно.

спасибо

4b9b3361

Ответ 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*), если у вашего действия уже есть ключ, вы можете получить действие.
Если действие с использованием того же ключа уже выполняется, оно удалено до добавления нового действия.