我对 iOS 上的 native 编程还很陌生。我的游戏场景中有一个函数可以移动 SKSpriteNode 数组。每次移动完成后,应将其节点从场景中删除。该函数还有一个完成函数,应在删除所有 SKNode 后调用。我的问题是,是否有一种更干净的方法可以在 moveAction 的持续时间中添加一点额外的时间,直到调用完成函数(见下文)。我也尝试过 Action 序列,但无法想出可行的解决方案......
我们将不胜感激每一个帮助!
func animateNodes(nodes: Array<SKSpriteNode>, completion:() -> ()) {
let duration = NSTimeInterval(0.5)
for (_, node) in nodes.enumerate() {
let point = CGPointMake(node.position.x - 80, node.position.y + 80)
let moveAction = SKAction.moveTo(point, duration: duration)
let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration)
node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: {
node.removeFromParent()
})
}
runAction(SKAction.waitForDuration(duration + 0.1), completion:completion)
}
最佳答案
添加一个变量count
来跟踪当前事件的节点数量。在每个节点的完成中,递减计数并检查它是否是最后一个(count == 0)
,如果是,则运行完成操作:
func animateNodes(nodes: Array<SKSpriteNode>, completion:() -> ()) {
var count = nodes.count
let duration = NSTimeInterval(0.5)
for (_, node) in nodes.enumerate() {
let point = CGPointMake(node.position.x - 80, node.position.y + 80)
let moveAction = SKAction.moveTo(point, duration: duration)
let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration)
node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: {
node.removeFromParent()
count--
if count == 0 {
completion()
}
})
}
}
我还没有编译或运行这个,所以可能会有错误,但这应该可以工作
关于swift - 正确检测同时 SKAction 的完成情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31074934/