SKAction完成处理程序;Swift中的用法

SKAction完成处理程序;Swift中的用法,swift,sprite-kit,handler,skaction,completion,Swift,Sprite Kit,Handler,Skaction,Completion,我不熟悉斯威夫特和斯皮特基特。很多SpriteKit动作的示例都在Objective C中,我无法在Swift中映射到,也无法开始工作 如果运行一个SKAction,并且在SKAction完成后想要做其他事情,我如何在Swift中正确地实现这一点 spaceMan.runAction(spaceManDeathAnimation, completion: { println("red box has faded out") }) 任何想法都将不胜感激 编辑: 在

我不熟悉斯威夫特和斯皮特基特。很多SpriteKit动作的示例都在Objective C中,我无法在Swift中映射到,也无法开始工作

如果运行一个SKAction,并且在SKAction完成后想要做其他事情,我如何在Swift中正确地实现这一点

    spaceMan.runAction(spaceManDeathAnimation, completion: {
        println("red box has faded out")
    })
任何想法都将不胜感激

编辑:

在此处发现问题:

spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count: 1)
另外,sangony发布了一个非常好的链接,解决了

    spaceMan.runAction(spaceManDeathAnimation, completion: {() -> Void in
        println("death")
    })

非常感谢大家对解决方案的贡献

您的“死亡”操作将永远运行,因此不会调用完成代码,这意味着它将永远不会结束

你可以用

+ repeatAction:count:
设置完成前重复次数计数的方法:

spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count:5)

在Swift中,您可以使用此扩展:

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 )
        }
    }
}
例如,用作:

myShip.runAction(move,withKey:"swipeMove",optionalCompletion: {
  //Here action is ended..do whatever you want
}
Swift 3: 用法

myShip.runAction(action: move, withKey:"swipeMove", optionalCompletion: {
       //Here action is ended..do whatever you want
}

您需要的是一个SKAction在SKAction序列中运行一个块。spaceManDeathAnimation操作的作用是什么?它是如何定义的?你也可以分享它的代码吗?在页面上搜索“完成”以获得一些好的例子。我需要
SKAction.repeatAction(东西,计数:1)
才能工作!谢谢我为两个非常愚蠢的问题道歉:为什么要用key:String指定
到第一个操作?第二个函数做什么:
func actionForKeyIsRunning(key:String)->Bool{return self.action(forKey:key)!=nil?true:false}
@它只需检查一个操作当前是否正在运行。它很有用,例如:如果!sprite.actionForKeyIsRunning(“rotate”){//do rotation)}为了避免旋转覆盖眼睛,当然,如果您想在编写时删除它,也可以使用它。很抱歉,我只看到了您的第一条注释,您的注释的答案是:因为您可以使用键识别操作。
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
    }
}
myShip.runAction(action: move, withKey:"swipeMove", optionalCompletion: {
       //Here action is ended..do whatever you want
}