swift - 在哪些情况下 SKNode 上的 runAction 无法完成?

标签 swift sprite-kit skaction

是否存在使用 runAction 运行 SKAction 无法完成的已知情况?

我在不同的 SKNode 上启动了多个“runAction”。为了同步所有这些操作,我使用了一个计数器,该计数器在每个 SKAction 的完成 block 内递增。当计数器达到启动的 SKAction 的确切数量时,动画就完成了。

有时一个 SKAction 未完成,则动画永远不会完成。

// Several actions are launched...
myNode.runAction(myActions,completion:{

    checkCompletion()

})



// Check if all actions completed
//
// numberOfLaunchedActions: number of actions launched
// logDebug: some log helper
func checkCompletion() {

    // This counter is initialized earlier
    numberOfCompletedActions++

    logDebug(">> Actions completed: \(numberOfCompletedActions)/\(numberOfLaunchedActions)")

    if numberOfCompletedActions == numberOfLaunchedActions {
        /// some statements
         logDebug("Animation Completed!")
    }

}

操作是动态生成的,由以下操作的序列组成:

  • waitForDuration
  • 缩放至
  • 移动
  • 隐藏
  • 取消隐藏

没有removeFromParent,也没有runAction,也没有runBlock

我关注的行动如下:

let waitAction = SKAction.waitForDuration(0.4)

let scaleAction = SKAction.scaleTo(0.1, duration: 2.0)
scaleAction.timingMode = .EaseOut

let myAction = SKAction.sequence([
    waitAction,
    scaleAction,
])

最佳答案

有一种已知情况:在序列中的从父项中删除之后添加操作:SKAction runAction does not execute completion block

正如评论中所解释的:

Remove from parent is causing the rest of the actions in the sequence not to be called, since the involved node is no longer in the scene. The sequence didn't complete, therefore the completion block shouldn't be called.

关于swift - 在哪些情况下 SKNode 上的 runAction 无法完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30767323/

相关文章:

swift - OS X 保存位置权限

ios - 将相同类型的 SKAction 添加到 sprite 会覆盖之前的 Action 吗?

swift - 了解 Spritekit 运行 block ,变量不符合预期

objective-c - Obj-C/Swift 混合中的枚举和数组访问

ios - 如何制作带有圆角和单线边框的缩进 UITableViewCell

ios - 在 objective-c 中使用 NSUserDefaults 保存、加载和更新获胜计数

ios - 如何预加载纹理图集以获得更好的 FPS?在 swift

ios - SKNode runAction 滞后 :completion: in recursive method

swift - 中间有scnTube的scnBox

ios - 如何在 spriteKit 中以特定角度施加力?