2015-04-15 69 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屬性調整速度。