检测SKAction是否完成运行,Swift

3
我希望在一个操作完成之后而不是操作过程中改变变量的值。这是我的代码:
   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个回答

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)

非常感谢。如果我想在Swift中撤销一个操作,我该怎么做? - ecoguy

3
您应该使用完成处理程序:
fire.runAction(fireButtonReturn,
    completion: {
        println("has no actions")
        firePosition.x = 320
        firePosition.y = 280
    }
)

你的解决方案存在问题,因为通过runAction调用后,操作在后台运行,而主线程继续执行(因此在操作完成之前就到达了它)。

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..")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接