SKAction如何结合withKey和completion

Posted

技术标签:

【中文标题】SKAction如何结合withKey和completion【英文标题】:SKAction how to combine withKey and completion 【发布时间】:2014-03-17 00:11:50 【问题描述】:

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

-[SKAction runAction:withKey:]

-[SKAction runAction:completion:]

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

谢谢

【问题讨论】:

您可以使用一个动作序列,在其中添加一个 runBlock 动作作为完成块 【参考方案1】:

像这样在+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;

【讨论】:

【参考方案2】:

这是 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
    

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于SKAction如何结合withKey和completion的主要内容,如果未能解决你的问题,请参考以下文章

在随机时间结合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中生成节点

如何防止 SKAction 序列在解码后重新启动?

如何将异步CompletableFuture与完成的CompletableFuture结合起来?

如何使用 SKAction 改变 SKSpriteNode 的位置

如何停止或暂停 SKAction 播放音乐? - 斯威夫特

spritekit 如何在两个不同的节点上转换两个 SKAction