2015-04-15 13 views
6

Voglio animare 2 cubi per sempre, finché l'utente non ne tocca uno. L'animazione dovrebbe essere come un ∞.Animate SCNNode per sempre - SceneKit, Swift

Questi sono i miei cubi in sceneView voglio animare: cubes to be animated

che sto cercando di farlo con le animazioni nidificate e lo fa in parte funziona. Ora, dal momento che le animazioni aspettano sempre che siano terminate prima di iniziarne una nuova, non sembra affatto liscia.

Prima di continuare a sviluppare l'animazione I vorrei sapere se c'è un modo migliore (e in effetti funzionante). Questo è il mio codice corrente:

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") 
} 

L'output mostra le seguenti cose: log 0, log 5, log 6, log 1, log 2, log 4, log 2 ... e poi appena prosegue con log 4 e log 2 alternata.

Qualcuno può aiutarmi?

Nota

  • ho pensato che un approccio ricorsiva sarebbe meglio, pertanto sostituito animationKey = 1 con la chiamata al metodo è in ... non funziona più a tutti.

  • ho avuto le animazioni di lavorare una volta ma ora è ferma solo dopo aver terminato la prima animazione e totalmente ignora il 2 ° e 3 ° blocco di animazione ...

risposta

16

Se avete intenzione di animare un SCNNode i tuoi nodi eseguono un 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]; 

Il codice di cui sopra animerà myNode su e giù per sempre.

+0

Ok, questo è già ottimo. C'è un modo per assegnare opzioni alla SCNAction? Ad esempio, come ad esempio "CurveEaseIn". La cosa è che voglio che sia liscia, ma in questo momento finisce semplicemente l'animazione e inizia il successivo dopo ...:/ – LinusGeffarth

+1

action.timingMode = SCNActionTimingModeEaseInEaseOut; –

+0

Fantastico, grazie :) – LinusGeffarth

2

è possibile creare un'animazione CAKeyframeAnimation da un percorso di Bezier (vedere la proprietà path). In questo modo otterrai un'animazione molto fluida.

Per poter ripetere per sempre impostare repeatCount su HUGE_VALF e regolare la velocità utilizzando la proprietà timingFunction.

Problemi correlati