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

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

-[SKAction runAction:withKey:]

-[SKAction runAction:completion:]

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

谢谢

【问题讨论】:

  • 您可以使用一个动作序列,在其中添加一个 runBlock 动作作为完成块

标签: objective-c ios7 sprite-kit skspritenode


【解决方案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。
      如果使用相同键的操作已在运行,则在添加新操作之前将其删除

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 2021-08-03
        • 2017-01-12
        相关资源
        最近更新 更多