首页 文章

SceneKit:如何在一起动画多个SCNNode然后调用完成块一次

提问于
浏览
1

目标是同时为多个SCNNode制作动画,然后在完成所有动画后调用完成块 . 并行动画具有相同的持续时间,因此如果一起启动则将同时完成 .

This SO answer建议使用Sprite Kit的 group 函数,但Scene Kit中没有模拟,因为 SCNScene 类缺少 runAction .

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

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

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

2 回答

  • 1

    我最初接近这个的方式是,因为所有初始动画都具有相同的持续时间,所以将完成处理程序应用于其中一个动作 . 但是,有时,动画会挂起(SCNAction completion handler awaits gesture to execute) .

    我目前的成功解决方案是不将完成处理程序与_1245854一起使用,但延迟时间:

    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
    }
    

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

  • 1

    我没有完全想到这一点,但我会发布它以期有用 .

    一般问题,在最后一组操作完成后做一些事情,就是GCD的 dispatch_barrier . 将所有块提交到专用并发队列,然后使用 dispatch_barrier 提交Grand Finale完成块 . 所有以前的积木完成后,大结局运行 .

    我没有立即看到的是如何将这些GCD调用与SceneKit调用和完成处理程序集成 .

    也许 dispatch_group 是一种更好的方法 .

    编辑和评论欢迎!

相关问题