2015-04-15 104 views
6

我想永远为2个立方体制作动画,直到用户点击其中一个。动画应该像∞一样。永远动画SCNNode - SceneKit,Swift

这些都是我在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与调用,这是在方法......根本不工作了。

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

回答

16

如果你要一个动画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) 

目的-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上下永远。

+0

好的,这已经很棒了。有没有办法将选项分配给SCNAction?所以就像'CurveEaseIn'一样。事情是我希望它是光滑的,但现在它只是完成动画,然后开始下一个...:/ – LinusGeffarth

+1

action.timingMode = SCNActionTimingModeEaseInEaseOut; –

+0

很酷,谢谢:) – LinusGeffarth

2

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

要永久重复,请将其repeatCount设置为HUGE_VALF,并且您可以使用timingFunction属性调整速度。