ios - SceneKit:如何一起为多个 SCNNode 设置动画,然后调用完成 block 一次

标签 ios animation scenekit skaction scnnode

目标是同时为多个 SCNNode 设置动画,然后在所有动画完成后调用完成 block 。并行动画具有相同的持续时间,因此如果一起开始,将同时完成。

This SO answer建议使用 group Sprite Kit 的功能,但 Scene Kit 中没有类似功能,因为 SCNScene类缺少 runAction .

一种选择是针对每个节点单独运行所有操作,并让每个操作调用相同的完成函数,该完成函数必须维护一个标志以确保它只被调用一次。

另一种选择是避免完成处理程序并在与动画持续时间匹配的延迟后调用完成代码。然而,这会在测试期间产生竞争条件,因为有时动画在完成之前就被暂停了。

不过,这似乎很笨拙。在 SceneKit 中对多个节点的动画进行分组然后调用完成处理程序的正确方法是什么?

最佳答案

我最初处理这个问题的方法是,因为所有初始动画都具有相同的持续时间,所以将完成处理程序仅应用于其中一个 Action 。但是,有时,动画会挂断( SCNAction completion handler awaits gesture to execute )。

我当前成功的解决方案是不将完成处理程序与 SCNAction 结合使用。但有延迟:

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

调用示例:
delay(0.95) {
     self.scaleNode_2.runAction(moveGlucoseBack)
     self.fixedNode_2.runAction(moveGlucoseBack)
     self.scaleNode_3.hidden = true
     self.fixedNode_3.hidden = true
}

我怀疑这可以称为“正确的方式”,但它适用于我的使用,并消除了我在尝试使用完成处理程序在多个节点上运行动画时遇到的随机挂起。

关于ios - SceneKit:如何一起为多个 SCNNode 设置动画,然后调用完成 block 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39091024/

相关文章:

ios - 浏览文本,解析链接

XPCE/prolog 中的动画不够流畅

colors - 更改 SCNText 节点对象的颜色或纹理(Swift - Scenekit)

scenekit - 我有从 SCNScene 创建的 MDLAsset。如何提取 MDLMesh、MDLCamera 和 MDLLights?

android - 如何在 Android 中创建背景颜色的屏幕删除效果

rotation - 场景套件。如何绕其 Axis 旋转SCNNode

ios - 类 Parse 的重复接口(interface)定义

ios - 遍历 NSArray 并以 12 个为一组存储项目

ios - AVPlayer 无法将类型的值分配给类型

html - CSS 动画在返回时旋转