2015-03-25 5 views
0

Я реализовал multi-touch перетаскивание SKSpriteNodes в свою игру.Почему прикоснувшийся SKSpriteNode прекратил движение после быстрого перетаскивания и просмотра игры?

Работает, но, конечно, есть ошибка.

В iOS-симуляторе Случай 1: если я перетаскиваю узел вокруг экрана просмотра, то продолжайте перетаскивать узел с экрана просмотра, он исчезнет, ​​а затем продолжит перетаскивание узла обратно на экран. отображаются правильно. Это хорошо. Он работает, только если я делаю это медленно.

Случай 2: Если я выполняю то же самое движение (как упоминалось в случае 1), за исключением этого времени, я делаю это очень быстро, узел, когда он снова появляется на экране, «прилипает» к пятну на экране. На данный момент я еще не закончил прикосновение, т. Е. Кнопка мыши все еще удерживается. На симуляторе похоже, что я ничего не тащу.

Предполагаемое поведение после начала касания, создание узла в затронутом месте (работа хорошая), перетащить узел вокруг (рабочий), а затем, если узел перетаскивается с экрана, прикосновение должно заканчиваться, а узел должен быть удален.

Узлы и штрихи отслеживаются в массиве словаря.

На снимке экрана я щелкнул один раз, узел появился, удерживался все время и начал многократно перетаскивать его и левую часть экрана. Он создал множество узлов, которые должны были исчезнуть. Если я медленно вытаскиваю экран, а затем обратно на экран, он не будет создавать «лишние» узлы.

This is the problem

Я поместил упрощенную версию моего кода на GitHub для вас, чтобы попробовать этот вопрос для себя. Я потратил около 10 часов на эту проблему и не нашел решения. Ваша помощь очень ценится. GitHub repository StackOverflow Game1 project

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

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 

    for touch:AnyObject in touches{ 
     var location = touch.locationInNode(self) 

     // Add in the node    
     var hero = SKSpriteNode(imageNamed: "Player") 
     hero.name = "player" 

     // Make sure it is not off of the screen. 
     hero.position = location 
     self.addChild(hero) 

     let touchObj = touch as UITouch 
     selectedNodes[touchObj] = hero 

    } 
} 

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 

    for touch:AnyObject in touches { 
     //println("touhex count \(touches.count)") 
     let location = touch.locationInNode(self) 
     let touchObj = touch as UITouch 

     //println("Touches moved current loc: \(location)") 

     // Update the position of the sprites 
     if let node:SKSpriteNode? = selectedNodes[touchObj] { 
      if (node?.name == "player" || node?.name == "bar") 
      { 
       let size:CGFloat = CGFloat(node!.size.width)/2 
       node?.position = location 

      } 
     } 

    } 

} 

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 

    for touch:AnyObject in touches { 
     let touchObj = touch as UITouch 
     let location = touch.locationInNode(self) 

     println("Touch Ended \(location)") 

     if let exists:AnyObject? = selectedNodes[touchObj] { 
      println("attempt to remove") 
      let node:SKSpriteNode? = self.nodeAtPoint(location) as? SKSpriteNode 
      println("ended touch locaiton \(location)") 
      println("ended npde position \(node?.position)") 

      for (node) in selectedNodes{ 
       println("Touch n1 \(node.1.position)") 
      } 

      if (node?.name == "player") 
      { 
       println("removed") 
       node?.removeFromParent() 
       selectedNodes[touchObj] = nil 
      } 
     }    
    }     
} 

ответ

0

Проблема заключается в том, что при перемещении его быстро, то функция touchesEnded может срабатывать без позиции обновляется.
В вашей touchesEnded функции, вместо использования nodeAtPoint просто использовать exists.removeFromParent()

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 

    for touch:AnyObject in touches { 
     let touchObj = touch as UITouch 

     if let exists:SKNode = selectedNodes[touchObj] { 

      if (exists.name == "player") 
      { 
       exists.removeFromParent() 
       selectedNodes[touchObj] = nil 
      } 
     }    
    }     
}