ios - 永远为 SCNNode 设置动画 - SceneKit,Swift

标签 ios swift animation scenekit

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

这些是我想要设置动画的 sceneView 中的立方体: cubes to be animated

我正在尝试使用嵌套动画来做到这一点,它确实部分起作用了。现在,由于动画总是等到它们完成后再开始新的动画,所以它看起来一点也不流畅。

在继续开发 ∞ 动画之前,我想知道是否有更好(并且实际可行)的方法。这是我当前的代码:

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...然后继续 log 4log 2 交替。

有人可以帮我吗?

注意

  • 我认为递归方法会更好,因此我将 animationKey = 1 替换为调用其中的方法...根本不再起作用。

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

最佳答案

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

swift :

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

关于ios - 永远为 SCNNode 设置动画 - SceneKit,Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658772/

相关文章:

ios - 尝试为 IOS 8 编译时出现编译器错误

ios - 访问父数组不返回任何对象

ios - Swift/Backendless/使用未解析的标识符

swift - 更新的字典值不会保留在数组中

python - 如何使用seaborn热图制作jupyter HTML-matplotlib动画?

python - Pyplot zorder 丢失了动画

ios - 如何快速比较颜色

ios - for循环的返回字符串 - Swift 3

ios - 使用起始位置和距离计算新坐标

javascript - JS : Event on ScrollDown and ScrollUp