2016-12-16 9 views
0

私はtouchesBeganとを使用して移動できる3 SKSpriteNodesのゲームを持っています。しかしながら、ユーザがnodeAを移動し、nodeBと呼ばれる別のノードを渡すとき、nodeBnodeAのように続きます。SpriteKitで一度に複数のノードを移動する

SKSpriteNodesの配列を作成し、for-loopを使用して簡単に使用できます。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 


     let nodes = [nodeA, nodeB, nodeC] 

     for touch in touches { 

      let location = touch.location(in: self) 

      for node in nodes { 

       if node!.contains(location) { 

        node!.position = location 
       } 

      } 


     } 

    } 

すべてがnodeBnodeAに従う、nodeAnodeBでパスを移動し、交差された場合を除いて取り組んでいます。

は、どのように私はそれnodeBnodeAに従わないと、ユーザがnodeBを通じてnodeAnodeAパスを移動しているときというように作ることができます。

答えて

5

内部に実装よくやった、あなたの触れたノード

class GameScene 
{ 
    var touchedNodeHolder : SKNode? 

    override func touchesBegan(.....) 
    { 
     for touch in touches { 
      guard touchNodeHandler != nil else {return} //let's not allow other touches to interfere 
      let pointOfTouch = touch.location(in: self) 
      touchedNodeHolder = nodeAtPoint(pointOfTouch) 
     } 
    } 
    override func touchesMoved(.....) 
    { 
     for touch in touches { 

      let pointOfTouch = touch.location(in: self) 
      touchedNodeHolder?.position = pointOfTouch 
     } 
    } 
    override func touchesEnded(.....) 
    { 
     for touch in touches { 

      touchedNodeHolder = nil 
     } 
    } 
} 
+0

のための特別なノード変数を持っている、これは便利ですアプローチ。 –

+0

マルチタッチの使用を計画している場合は、終了したタッチのループが異なるタッチを区別するために必要ですが、おそらくこのチェックを追加する必要があります – Knight0fDragon

+0

これは良いアプローチですが、タッチするユーザーはそれらを許可します。 –

1

いくつかの実験の後、私はこの問題についていく方法を見つけました。

タッチの位置でノードを選択するのではなく、その名前プロパティでノードを選択することがトリックでした。

示すコードは、代わりに遅い検索を行うのtouchesMovedとtouchesBeganメソッド

//name of the nodes 
    let nodeNames = ["playO", "playOO", "playOOO", "playX", "playXX", "playXXX"] 
//the actual nodes 
    let player = [playerO, playerOO, playerOOO, playerX, playerXX, playerXXX] 

     for touch in touches { 

      let pointOfTouch = touch.location(in: self) 
      let tappedNode = atPoint(pointOfTouch) 
      let nameOfTappedNode = tappedNode.name 

      for i in 0..<nodeNames.count { 

       if nameOfTappedNode == nodeNames[i] { 
        z += 1 
        player[i]!.zPosition = CGFloat(z) 
        print(player[i]!.zPosition) 
        player[i]!.position = pointOfTouch 
       } 
      } 

     } 
関連する問題