SpriteKit - 为什么没有检测到 SKNode 的触摸
SpriteKit - Why SKNode's are not being touch detected
我查看了无数参考资料以试图理解为什么我的场景没有按照我预期的方式运行,例如 。
这是我非常简单的 SKScene(2 child 个节点):
- 场景有一个SpriteNode(覆盖整个场景作为背景图片)。这有一个 zPosition = 0.
- 场景有第二个节点 (SKNode),它本身有另一个 child(最多 2 个级别)。这有一个 zPosiiton - 2.
- 所有节点都有 .userInteractionEnabled = false
问题:
当我点击任何地方时,我看到的是第一个 child (SpriteNode) 被触摸了。第二个 child (SKNode) 永远不会 touch-detected.
请注意,节点的 z-ordering 正在按照我的预期进行渲染。 touch-detection 似乎不起作用。
我的 touchesBegan 方法片段:
for touch in touches {
let touchLocation = touch.locationInNode(self)
let sceneTouchPoint = self.convertPointToView(touchLocation)
let touchedNode = self.nodeAtPoint(sceneTouchPoint)
if (touchedNode.name != nil) {
print("Touched = \(touchedNode.name! as String)")
}
}
我有好几层节点,因为我在我的游戏中使用了一个带有按钮的蒙版来进行选择和前进。在我创建 "startState:Bool = true" 并在单击开始屏幕时将其更新为 false 之前,我遇到了按钮无法正常工作的问题。然后,我在该起始页上让我的每个按钮都有 && startState==true 以便进行点击。可能是你的点击被记录了——但它不是你认为你正在使用的节点。我会将 print("NodeXXX") 放在 touches 的每个条目上,并给它一个唯一的名称,这样你就可以看到触摸实际发生的位置。
希望对您有所帮助。
此致,
mpe
我有一个类似的问题(z 中的背景:999 + z 中的生成 "ducks" 节点:<999)我用 Swift 4 中的以下代码解决了:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch:UITouch = touches.first!
let positionInScene = touch.location(in: self)
let touchedNodes = self.nodes(at: positionInScene)
for touch in touchedNodes {
let touchName = touch.name
if (touchName != nil && touchName!.hasPrefix("pato_")) {
touch.removeFromParent()
}
}
}
我查看了无数参考资料以试图理解为什么我的场景没有按照我预期的方式运行,例如
这是我非常简单的 SKScene(2 child 个节点):
- 场景有一个SpriteNode(覆盖整个场景作为背景图片)。这有一个 zPosition = 0.
- 场景有第二个节点 (SKNode),它本身有另一个 child(最多 2 个级别)。这有一个 zPosiiton - 2.
- 所有节点都有 .userInteractionEnabled = false
问题:
当我点击任何地方时,我看到的是第一个 child (SpriteNode) 被触摸了。第二个 child (SKNode) 永远不会 touch-detected.
请注意,节点的 z-ordering 正在按照我的预期进行渲染。 touch-detection 似乎不起作用。
我的 touchesBegan 方法片段:
for touch in touches {
let touchLocation = touch.locationInNode(self)
let sceneTouchPoint = self.convertPointToView(touchLocation)
let touchedNode = self.nodeAtPoint(sceneTouchPoint)
if (touchedNode.name != nil) {
print("Touched = \(touchedNode.name! as String)")
}
}
我有好几层节点,因为我在我的游戏中使用了一个带有按钮的蒙版来进行选择和前进。在我创建 "startState:Bool = true" 并在单击开始屏幕时将其更新为 false 之前,我遇到了按钮无法正常工作的问题。然后,我在该起始页上让我的每个按钮都有 && startState==true 以便进行点击。可能是你的点击被记录了——但它不是你认为你正在使用的节点。我会将 print("NodeXXX") 放在 touches 的每个条目上,并给它一个唯一的名称,这样你就可以看到触摸实际发生的位置。
希望对您有所帮助。
此致, mpe
我有一个类似的问题(z 中的背景:999 + z 中的生成 "ducks" 节点:<999)我用 Swift 4 中的以下代码解决了:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch:UITouch = touches.first!
let positionInScene = touch.location(in: self)
let touchedNodes = self.nodes(at: positionInScene)
for touch in touchedNodes {
let touchName = touch.name
if (touchName != nil && touchName!.hasPrefix("pato_")) {
touch.removeFromParent()
}
}
}