我有SKSpriteNode
。这个SKSpriteNode
有几个孩子。如何检测是否被触摸过?现在,让我说清楚,我已经知道在SpriteKit中设置一个按钮,我尝试使用我用来检测主要父节点是否被触摸的相同代码,但它没有工作。按钮没有做任何事情。有没有办法来解决这个问题?此外,我已经尝试将子节点的用户交互设置为true。
答案 0 :(得分: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")
}
}
答案 1 :(得分:0)
您需要实施此方法
SKSpriteNode
在与要监视触摸事件的每个节点关联的类上。因此,您应该将此方法添加到主fill
的每个后代。