SKAction如何结合withKey和completion使用

24

我对iOS和Sprite Kit编程还很陌生,想知道如何组合以下内容:

-[SKAction runAction:withKey:]

-[SKAction runAction:completion:]

一方面,我希望防止节点再次运行相同的操作(或动作序列),另一方面,我想要在动作终止时做出反应,但是目前好像没有方法可以同时实现这两个目标。

谢谢


1
您可以使用操作序列,在其中添加一个runBlock操作作为完成块。 - CodeSmile
3个回答

30

使用+sequence:中的+runBlock:操作,如下:


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;

18

这是由Daniel L. Alves创造的使用SKNode扩展的关于 Swift 2.x 的好解决方案(下面更新到Swift 3.x..):

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

1
如果你想要对一个动作的终止做出反应,是的,你需要使用 SKAction runAction:(SKAction*) completion ^{ "Your special code here" }。这将在动作终止时执行你的特殊代码。
当你使用 SKAction runAction:(SKAction*) withKey:(NSString*) 时,如果你的动作已经有一个键,你可以检索该动作。
如果使用相同键的动作已经在运行,它会被删除,然后再添加新的动作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接