SKAction如何与Key结合并完成

时间:2014-02-17 15:50:00

标签: objective-c ios7 sprite-kit skspritenode

我是iOS和Sprite Kit编程的新手,并想知道如何组合:

-[SKAction runAction:withKey:]

-[SKAction runAction:completion:]

一方面,我想阻止一个节点再次运行相同的动作(或动作序列),另一方面,我想对一个动作的终止做出反应,但是没有方法,到目前为止正如我所见,无法同时使用两者。

THX

3 个答案:

答案 0 :(得分:27)

+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;

答案 1 :(得分:15)

对于Daniel L. Alves创建的 Swift 2.x (更新为 Swift 3.x ,以下..),这是一个很好的解决方案,使用{{1 }} extension:

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

答案 2 :(得分:1)

如果您想对终止操作做出反应,是的,您需要使用SKAction runAction:(SKAction*) completion ^{ "Your special code here" }。这将在动作终止时执行您的特殊代码。

当您使用SKAction runAction:(SKAction*) withKey:(NSString*)时,如果您的操作已有密钥,则可以检索该操作 如果使用相同键的操作已在运行,则在添加新操作之前已删除