首页 文章

永久动画 SCNNode - SceneKit,Swift

提问于
浏览
6

我想永远动画 2 个立方体,直到用户点击其中一个。动画应该像∞一样。

这些是我想要动画的 sceneView 中的我的立方体:
立方体动画

我试图用嵌套动画做到这一点,它确实部分工作。现在,由于动画总是等到它们在开始新动画之前完成,它看起来并不光滑。

在继续开发∞-animation 之前,我想知道是否有更好的(实际工作)方式。这是我目前的代码:

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position = SCNVector3Make(3, 0, 0)
cube2.position = SCNVector3Make(-3, 0, 0)
println("log 0")
SCNTransaction.setCompletionBlock {
    println("log 1")
    while (animationKey != 1) {
        //initially animationKey = 0
        SCNTransaction.begin()
        SCNTransaction.setAnimationDuration(2)
        cube1.position.x += 1
        cube1.position.y += 1
        cube2.position.x += 1
        cube2.position.y += 1
        println("log 2")
        SCNTransaction.setCompletionBlock {
            SCNTransaction.begin()
            SCNTransaction.setAnimationDuration(2)
            cube1.position.x -= 1
            cube1.position.y -= 1
            cube2.position.x -= 1
            cube2.position.y -= 1
            println("log 3")
            SCNTransaction.setCompletionBlock { animationKey = 1 }
            SCNTransaction.commit()
        }
        println("log 4")
        SCNTransaction.commit()
        }
    }
    println("log 5")
    SCNTransaction.commit()
    println("log 6")
}

输出显示以下内容:log 0, log 5, log 6, log 1, log 2, log 4, log 2 ...and 然后它继续log 4log 2交替。

有人可以帮助我吗?

注意

  • 我认为递归方法会更好,因此我用调用方法替换了animationKey = 1,这完全不再有效。

  • 我让动画工作一次,但现在它只是在完成第一个动画后停止并完全忽略了第二和第三个动画块......

2 回答

  • 24

    如果要为SCNNode设置动画,请让节点运行SCNAction

    迅速:

    let moveUp = SCNAction.moveBy(x: 0, y: 1, z: 0, duration: 1)
    moveUp.timingMode = .easeInEaseOut;
    let moveDown = SCNAction.moveBy(x: 0, y: -1, z: 0, duration: 1)
    moveDown.timingMode = .easeInEaseOut;
    let moveSequence = SCNAction.sequence([moveUp,moveDown])
    let moveLoop = SCNAction.repeatForever(moveSequence)
    myNode.runAction(moveLoop)
    

    Objective-C:

    SCNAction *moveUp = [SCNAction moveByX:0 Y:1 Z:0 duration:1];
    moveUp.timingMode = SCNActionTimingModeEaseInEaseOut;
    SCNAction *moveDown = [SCNAction moveByX:0 Y:-1 Z:0 duration:1];
    moveDown.timingMode = SCNActionTimingModeEaseInEaseOut;
    SCNAction *moveSequence = [SCNAction sequence:@[moveUp,moveDown]];
    SCNAction *moveLoop = [SCNAction repeatActionForever:moveSequence];
    [myNode runAction:moveLoop];
    

    上面的代码将永久地向上和向下动画myNode

  • 4

    您可以从 Bezier 路径创建CAKeyframeAnimation动画(请参阅path属性)。这样你就可以得到一个非常流畅的动画。

    为了永远重复它将repeatCount设置为HUGE_VALF,你可以使用timingFunction属性调整速度。

相关问题