У меня есть SKSpriteNode
. У этого SKSpriteNode
есть несколько детей. Как я могу определить, было ли это затронуто? Теперь позвольте мне быть ясным, я уже знаю, чтобы настроить кнопку в SpriteKit, и я попытался использовать тот же код, который я использовал, чтобы определить, был ли затронут основной родительский узел, но он не работает. Кнопка ничего не делает. Есть ли способ исправить это? Кроме того, я уже пытался установить взаимодействие пользователя с true для дочерних узлов.Как определить, был ли затронут дочерний узел: Sprite Kit
ответ
Вот один из способов отслеживания непрерывных касаний (например, направленных стрелок).
Вам нужно следить за прикосновениями, в узле 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")
}
}
Вы должны реализовать этот метод
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("Touched")
}
на классе, связанный с каждым узлом вы хотите следить за сенсорные события. Поэтому вы должны добавить этот метод к каждому потоку вашего основного SKSpriteNode
.
Этот код ничего не делает. –
@LukeVanIn: Я добавил печать к моему методу. Спасибо за подсказку. –
Что вы подразумеваете под «реализовать этот метод в классе, связанном с каждым узлом, который вы должны отслеживать для событий касания». Итак, вы должны добавить этот метод для каждого потомка вашего основного SKSpriteNode? Где это, в коде? Я был под впечатлением прикосновенийBegan работает только в SKView ... но я смущен ... – Confused
Этот код не компилируется –
@appzYourLife И не должен. В чем ваш смысл? –
@appzYourLife Вы ссылаетесь на то, что он не компилируется с быстрым 2? –