24

我对 iOS 和 Sprite Kit 编程很陌生,想知道如何结合:

-[SKAction runAction:withKey:]

-[SKAction runAction:completion:]

一方面,我想阻止节点再次运行相同的动作(或动作序列),另一方面,我想对动作的终止做出反应,但是没有方法,据我所知, 没办法同时使用。

谢谢

4

3 回答 3

29

像这样使用+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;
于 2014-02-22T13:07:34.407 回答
17

这是Daniel L. Alves 创建的Swift 2.x(在下面更新到Swift 3.x )的一个很好的解决方案,使用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
    }
}
于 2016-03-18T13:56:35.153 回答
1

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

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

于 2014-02-22T12:55:56.187 回答