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

时间:2015-04-19 15:35:40

标签: ios swift sprite-kit

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

   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
            } 
        }       
    }
}

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

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

3 个答案:

答案 0 :(得分:6)

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

//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)

答案 1 :(得分:3)

你应该使用一个完成处理程序:

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

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

答案 2 :(得分:0)

extension SKNode {
    func actionForKeyIsRunning(key: String) -> Bool {
        if self.actionForKey(key) != nil {
            return true
        } else {
            return false
        }
    }
}

你可以使用它:

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