检测SKAction是否已完成运行,Swift

eco*_*guy 3 ios sprite-kit swift

我想在运行一个动作后更改变量的值,而不是在它运行期间.这是我的代码:

   override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

    if gameNotStarted {
        if firePosition.x != 320 || firePosition.y > 280 {  
            fire.runAction(fireButtonReturn)
            iapButton.runAction(iapButtonReturn)
            aboutButton.runAction(abtButtonReturn)

            if fire.hasActions() == false {
                println("has no actions")
                firePosition.x = 320
                firePosition.y = 280
            } 
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在运行的三个操作具有完全相同的持续时间,所以我只需要一个来检查它们是否已经完成运行.他们已经运行完毕之后,我想改变的数值firePosition.xfirePosition.y.非常重要的是,火灾位置值在动作运行后完全改变,绝对不是在动作完成运行之前.

但是根据我目前的代码,我从不if fire.hasActions() ...根据结果​​和控制台运行该部分.我发现了类似的问题,他们是在obj-c.谢谢你的帮助.

Chr*_*örz 6

您应该使用完成处理程序来解决您的问题:

//Run the action
iapButton.runAction(iapButtonReturn,
    //After action is done, just call the completion-handler.
    completion: {
        firePosition.x = 320
        firePosition.y = 280
    }
)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用a SKAction.sequence并在以下内容中添加操作SKAction.block:

var block = SKAction.runBlock({
    fire.runAction(fireButtonReturn)
    iapButton.runAction(iapButtonReturn)
    aboutButton.runAction(abtButtonReturn)
})

var finish = SKAction.runBlock({
    firePosition.x = 320
    firePosition.y = 280
})

var sequence = SKAction.sequence([block, SKAction.waitForDuration(yourWaitDuration), finish])

self.runAction(sequence)
Run Code Online (Sandbox Code Playgroud)