检测 SKAction 是否完成 运行、Swift
Detecting if SKAction is done running, Swift
我想在操作 运行 之后而不是在 运行ning 期间更改变量的值。这是我的代码:
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
}
}
}
}
我 运行ning 的三个动作的持续时间完全相同,所以我只需要一个来检查它们是否完成 运行ning。在他们完成 运行ning 之后,我想更改 firePosition.x
和 firePosition.y
的值。
非常重要的是,火力位置值在动作 运行 之后发生变化,绝对不会在动作完成 运行ning.
之前发生变化。
然而,对于我当前的代码,我从来没有 运行 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)
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..")
}
我想在操作 运行 之后而不是在 运行ning 期间更改变量的值。这是我的代码:
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
}
}
}
}
我 运行ning 的三个动作的持续时间完全相同,所以我只需要一个来检查它们是否完成 运行ning。在他们完成 运行ning 之后,我想更改 firePosition.x
和 firePosition.y
的值。
非常重要的是,火力位置值在动作 运行 之后发生变化,绝对不会在动作完成 运行ning.
然而,对于我当前的代码,我从来没有 运行 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)
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..")
}