Я реализовал multi-touch перетаскивание SKSpriteNodes в свою игру.Почему прикоснувшийся SKSpriteNode прекратил движение после быстрого перетаскивания и просмотра игры?
Работает, но, конечно, есть ошибка.
В iOS-симуляторе Случай 1: если я перетаскиваю узел вокруг экрана просмотра, то продолжайте перетаскивать узел с экрана просмотра, он исчезнет, а затем продолжит перетаскивание узла обратно на экран. отображаются правильно. Это хорошо. Он работает, только если я делаю это медленно.
Случай 2: Если я выполняю то же самое движение (как упоминалось в случае 1), за исключением этого времени, я делаю это очень быстро, узел, когда он снова появляется на экране, «прилипает» к пятну на экране. На данный момент я еще не закончил прикосновение, т. Е. Кнопка мыши все еще удерживается. На симуляторе похоже, что я ничего не тащу.
Предполагаемое поведение после начала касания, создание узла в затронутом месте (работа хорошая), перетащить узел вокруг (рабочий), а затем, если узел перетаскивается с экрана, прикосновение должно заканчиваться, а узел должен быть удален.
Узлы и штрихи отслеживаются в массиве словаря.
На снимке экрана я щелкнул один раз, узел появился, удерживался все время и начал многократно перетаскивать его и левую часть экрана. Он создал множество узлов, которые должны были исчезнуть. Если я медленно вытаскиваю экран, а затем обратно на экран, он не будет создавать «лишние» узлы.
Я поместил упрощенную версию моего кода на 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
}
}
}
}