2014-12-07 13 views
5

Ich arbeite in Swift mit Sprite-Kit mit XCode 6, und ich habe viele verschiedene Knoten, aber im Moment gelingt es mir nur einen Finger zu erkennen und einen Knoten gleichzeitig zu bewegen. Ich möchte wissen, wie es mir gelingt, mehrere Finger zu erkennen, um mehrere Knoten gleichzeitig zu bewegen. Mein eigentlicher Code ist:Multi-Touch Geste in Sprite Kit

var location = CGFloat() // finger position 
var actualNode = -1 // node touched by the finger, -1 means no node touched 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) // when a finger touch the screen 
{ 
    for touch: AnyObject in touches 
    { 
     location = touch.locationInNode(self) // we detect the finger position 
    } 

    for var index = 0; index < colorNode.count; index++ 
    { 
     if nodeAtPoint(location) == colorNode[index].node 
     { 
      actualNode = index // the number of the node touched by the finger 
     } 
    } 
} 

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) // when a finger move 
{ 
    for touch: AnyObject in touches 
    { 
     location = touch.locationInNode(self) // we detect the finger position 
    } 

    if actualNode != -1 // if a node is touched 
    { 
     colorNode[actualNode].position = location // we move this node to the finger 
    } 
} 
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) // when a finger don't touch the screen anymore 
{   
    actualNode = -1 // there is no node touched 
} 

Wie Sie mich nur die position meine ersten Finger haben sehen können, aber wie kann ich mehrere Fingerposition erkennen und jeden Finger auf die mit dem Finger berühren Knoten zuweisen?

Antwort

9

Das gleichzeitige Verschieben mehrerer Knoten ist relativ einfach. Der Schlüssel ist, jedes Berührungsereignis unabhängig zu verfolgen. Eine Möglichkeit besteht darin, ein Wörterbuch zu verwalten, das das Berührungsereignis als Schlüssel verwendet und den Knoten als Wert verschiebt.

Zuerst erklärt das Wörterbuch

var selectedNodes:[UITouch:SKSpriteNode] = [:] 

hinzufügen jeden Sprit in das Wörterbuch mit dem Touch-Ereignisse als Schlüssel

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in:self) 
     if let node = self.atPoint(location) as? SKSpriteNode { 
      // Assumes sprites are named "sprite" 
      if (node.name == "sprite") { 
       selectedNodes[touch] = node 
      } 
     } 
    } 
} 

aktualisieren berühren die Positionen des Sprites nach Bedarf

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in:self) 
     // Update the position of the sprites 
     if let node = selectedNodes[touch] { 
      node.position = location 
     } 
    } 
} 

Entfernen Sie das Sprite aus dem Wörterbuch, wenn die Berührung endet

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     if selectedNodes[touch] != nil { 
      selectedNodes[touch] = nil 
     } 
    } 
} 
+0

Danke. Das funktioniert gut. – Epsilon