2017-03-06 11 views
2

シーンキットゲームでは、シーンにランダムにノードが追加されます。これらのノードは、目的の終了位置を過ぎるまで一方向に移動してから削除されます。彼らは上下、左右に移動することができます。 (私はnode.runAction(SCNAction.repeatActionForever(SCNAction.moveBy(...を使用します)ノードを削除すると保存サイクルが発生する

以下は、ノードが終了位置を過ぎて削除できるようになったときに検出したものです。

私が午前問題は、これは動作しますが、何らかの理由でそれがSCNActionMoveSCNActionRepeatで保持サイクルを引き起こしている、です。

これを避ける唯一の方法は、ゲームが終了した後にforループですべてのノードを一度に削除することですが、ゲームを長時間再生できるので理想的ではありません。

ありがとうございます!

func renderer(renderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) { 

    // If any nodes have been spawned 
    if spawnedNodeArray.count > 0 { 

     // Get the first spawned node 
     let node = rootNode.childNodeWithName(spawnedNodeArray[0].nodeName, recursively: true)! 

     // If node is moving RIGHT, check if node has reached end position 
     if spawnedNodeArray[0].Direction == "RIGHT" { 
      // If node has reached past end position... 
      if node.position.x >= Float(spawnedNodeArray[0].EndXPos) { 
       node.removeAllActions() 
       node.removeFromParentNode() 
       spawnedNodeArray.removeAtIndex(0) 
      } 
     } 

     // If node is moving LEFT, check if node has reached end position 
     else if spawnedNodeArray[0].Direction == "LEFT" { 
      // If node has reached past end position... 
      if node.position.x <= Float(spawnedNodeArray[0].EndXPos) { 
       node.removeAllActions() 
       node.removeFromParentNode() 
       spawnedNodeArray.removeAtIndex(0) 
      } 
     } 

     // If node is moving DOWN, check if node has reached end position 
     else if spawnedNodeArray[0].Direction == "DOWN" { 
      // If node has reached past end position... 
      if node.position.z >= Float(spawnedNodeArray[0].EndZPos) { 
       node.removeAllActions() 
       node.removeFromParentNode() 
       spawnedNodeArray.removeAtIndex(0) 
      } 
     } 

     // If node is moving UP, check if node has reached end position 
     else if spawnedNodeArray[0].Direction == "UP" { 
      // If node has reached past end position... 
      if node.position.z <= Float(spawnedNodeArray[0].EndZPos) { 
       node.removeAllActions() 
       node.removeFromParentNode() 
       spawnedNodeArray.removeAtIndex(0) 
      } 
     } 
    } 
} 

SCNActionRepeatSCNActionMove

答えて

0

保持サイクルを停止する方法を理解しました。

私はアクションキーを与えなければならなかったので、すべてのアクションを削除する代わりに、キーのアクションだけを削除します。

例:

node.runAction(..., forKey: "moveAction") 

node.removeActionForKey("moveAction") 
1

ないあなたはどのように再利用可能なノードのプールが維持について

を尋ねたが...質問への直接の答えは?死ぬときにノードを削除する代わりに、hiddenプロパティをtrueに設定し、それを再利用キューに追加します。常に新しいノードを作成するのではなく、まず既存のノードをデキューしてみます。

+0

グレートの提案、私はこれを試してみるだろう。ありがとう! – P3rry

関連する問題