Ios 检测SKAction是否在运行中完成,Swift

Ios 检测SKAction是否在运行中完成,Swift,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我想在操作运行后更改变量的值,而不是在操作运行期间。这是我的代码: override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { if gameNotStarted { if firePosition.x != 320 || firePosition.y > 280 { fire.runAction(fireButtonRe

我想在操作运行后更改变量的值,而不是在操作运行期间。这是我的代码:

   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
            } 
        }       
    }
}
override func touchesend(touchs:Set,withEvent-event:UIEvent){
如果游戏没有开始{
如果firePosition.x!=320 | | firePosition.y>280{
fire.runAction(fireButtonReturn)
运行操作(iapButtonReturn)
aboutButton.runAction(abtButtonReturn)
如果fire.hasActions()=false{
println(“无操作”)
火势x=320
火势y=280
} 
}       
}
}
我正在运行的三个操作的持续时间完全相同,因此我只需要一个操作来检查它们是否已完成运行。在它们完成运行后,我想更改
firePosition.x
firePosition.y
的值。 非常重要的一点是,火力位置值在动作运行后完全改变,而绝对不是在动作运行前改变

但是,对于我当前的代码,我从未根据结果和控制台运行if fire.hasActions()…部分。 我发现了类似的问题,它们在obj-c中。
谢谢您的帮助。

您应该使用完成处理程序:

fire.runAction(fireButtonReturn,
    completion: {
        println("has no actions")
        firePosition.x = 320
        firePosition.y = 280
    }
)

解决方案的问题是,操作是通过runAction调用启动的,但随后在后台运行,同时主线程继续执行(因此在操作完成之前到达它)。

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

//Run the action
iapButton.runAction(iapButtonReturn,
    //After action is done, just call the completion-handler.
    completion: {
        firePosition.x = 320
        firePosition.y = 280
    }
)
或者您可以使用
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)
您可以使用它:

if myShip.actionForKeyIsRunning("swipedLeft") {
   print("swipe in action..")
}

谢谢。如果我想在swift中撤销一个动作,我会怎么做?
if myShip.actionForKeyIsRunning("swipedLeft") {
   print("swipe in action..")
}