2016-07-10 1 views
0

У меня есть SKSpriteNode. У этого SKSpriteNode есть несколько детей. Как я могу определить, было ли это затронуто? Теперь позвольте мне быть ясным, я уже знаю, чтобы настроить кнопку в SpriteKit, и я попытался использовать тот же код, который я использовал, чтобы определить, был ли затронут основной родительский узел, но он не работает. Кнопка ничего не делает. Есть ли способ исправить это? Кроме того, я уже пытался установить взаимодействие пользователя с true для дочерних узлов.Как определить, был ли затронут дочерний узел: Sprite Kit

ответ

2

Вот один из способов отслеживания непрерывных касаний (например, направленных стрелок).

Вам нужно следить за прикосновениями, в узле SKScene, или в контроллере родительского вида:

var touches = Set<UITouch>() 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

Для каждого прикосновения, перевести координаты относительно SKNode. Проверьте, не находится ли какое-либо касание в пределах накопленного кадра SKNode. Накопленный фрейм - это общая ограничивающая область узла и всех его потомков.

private func isTouching(node: SKNode) -> Bool { 

    guard let parent = node.parent else { 
     return false 
    } 

    let frame = node.calculateAccumulatedFrame() 

    for touch in touches { 

     let coordinate = touch.location(in: parent) 

     if frame.contains(coordinate) { 
      return true 
     } 
    } 

    return false 
} 

Например:

override func update(_ currentTime: NSTimeInterval) { 

    let touchingJump = isTouching(node: jumpButtonNode) 

    if touchingJump { 
     print("jump") 
    } 
} 
+0

Этот код не компилируется –

+0

@appzYourLife И не должен. В чем ваш смысл? –

+0

@appzYourLife Вы ссылаетесь на то, что он не компилируется с быстрым 2? –

0

Вы должны реализовать этот метод

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    print("Touched") 
} 

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

+0

Этот код ничего не делает. –

+0

@LukeVanIn: Я добавил печать к моему методу. Спасибо за подсказку. –

+0

Что вы подразумеваете под «реализовать этот метод в классе, связанном с каждым узлом, который вы должны отслеживать для событий касания». Итак, вы должны добавить этот метод для каждого потомка вашего основного SKSpriteNode? Где это, в коде? Я был под впечатлением прикосновенийBegan работает только в SKView ... но я смущен ... – Confused