2016-08-23 20 views
1

目的は複数のSCNNodeを同時にアニメーション化し、すべてのアニメーションが完了したら完了ブロックを呼び出すことです。パラレルアニメーションは同じ持続時間を持ちますので、同時に起動すると同時に完了します。 SceneKit:複数のSCNNodeを一緒にアニメーション化して、完了ブロックを一度呼び出す方法

This SO answer

は、Sprite Kitの group機能を使用して提案したが、 SCNSceneクラスは runActionがないため、シーンキットにはアナログはありません。

1つのオプションは、各ノードに対してすべてのアクションを個別に実行し、それぞれが同じ完了関数を呼び出すようにします。フラグは1回だけ呼び出されるようにする必要があります。

もう一つの選択肢は、完了ハンドラを避け、アニメーションの持続時間に合わせた遅延の後に完了コードを呼び出すことです。ただし、テスト中に競合状態が発生することがあります。これは、アニメーションが完了する前に停止することがあるためです。

これはちょっと大変ですね。 SceneKitの複数のノードのアニメーションをグループ化して補完ハンドラを呼び出す正しい方法は何ですか?

答えて

1

初期のアニメーションのすべてが同じ継続時間を持つので、完了ハンドラをアクションの1つに適用すると、私が最初にこれにアプローチした方法がありました。しかし、時々、アニメーションがハングアップする(SCNAction completion handler awaits gesture to execute)。呼び出しの

func delay(delay:Double, closure:()->()) { 
    dispatch_after(
     dispatch_time(
      DISPATCH_TIME_NOW, 
      Int64(delay * Double(NSEC_PER_SEC)) 
     ), 
     dispatch_get_main_queue(), closure) 
} 

examlpe:

delay(0.95) { 
    self.scaleNode_2.runAction(moveGlucoseBack) 
    self.fixedNode_2.runAction(moveGlucoseBack) 
    self.scaleNode_3.hidden = true 
    self.fixedNode_3.hidden = true 
} 

私はこれをすることができ疑う

私の現在、成功したソリューションはなく、遅延とSCNActionと一緒に完了ハンドラを使用しないことです「正しい方法」と呼ばれていますが、私の用途にはうまくいき、完成ハンドラで複数のノードでアニメーションを実行しようとして経験した無作為なハングアップを排除します。

+0

質問を更新する必要がありますが、これも私たちが使用したアプローチです。残念ながら、アニメーションは時々遅れることがあるため、競合状態が発生します。 – Crashalot

1

私はこれを完全には考えていませんが、私は有用であることを希望して投稿します。

GCDのdispatch_barrierについての一般的な問題は、一連のアクションの最後が完了した後に何かが起こるかどうかです。すべてのブロックをプライベートコンカレントキューにサブミットし、dispatch_barrierでグランドフィナーレ完了ブロックを送信します。前のブロックがすべて終了した後、Grand Finaleが実行されます。

すぐにわからないのは、これらのGCDコールをSceneKitコールと完了ハンドラと統合する方法です。

dispatch_groupが良い方法です。

編集とコメント歓迎!

+0

ありがとう、ハル。もっと聞くのを楽しみにして... – Crashalot

関連する問題