我将节点子类化以用于触摸检测。我有一个盒子父母,它旁边有一个行子,灰色空间只是空格:
问题是当我点击灰色空间时,它会在盒子上注册为触摸,这是非常遥远的。
这里是我显示问题的代码,以及我糟糕的解决方法......我制作了两套方框,第一组显示问题,第二组是解决方法:< / p>
import SpriteKit
class GameScene: SKScene {
enum sizez {
static let
box = CGSize(width: 50, height: 35),
line = CGSize(width: 200, height: 10)
}
class Box: SKSpriteNode {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touched box")
}
}
class Line: SKSpriteNode {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touched line")
}
}
override func didMove(to view: SKView) {
// The problem sprites that register touch despite empty space:
let box = Box(color: .red, size: sizez.box)
box.isUserInteractionEnabled = true
addChild(box)
let line = Line(color: .purple, size: sizez.line)
line.isUserInteractionEnabled = true
line.anchorPoint = CGPoint.zero
line.position = CGPoint(x: box.frame.maxX + 10, y: box.frame.minY)
///////////////////
box.addChild(line)
///////////////////
// These sprites detect touches properly (no detection in empty space)
let box2 = Box(color: .red, size: sizez.box)
box2.isUserInteractionEnabled = true
box2.position.y -= 100
addChild(box2)
let line2 = Line(color: .purple, size: sizez.line)
line2.isUserInteractionEnabled = true
line2.anchorPoint = CGPoint.zero
line2.position = CGPoint(x: box2.frame.maxX + 10, y: box2.frame.minY)
////////////////
addChild(line2)
////////////////
}
}
当您直接点击顶行(甚至更远离)顶行时,您会看到:
当您对底线做同样的事情时,您会得到:
放弃SK内置的父/子系统将是一个巨大的麻烦,然后让我自己手动跟踪它们......以及它对我来说是一个很大的性能打击应用
任何合理的解决方法或解决方案都可以让我在使用与第一个框类似的代码时点击灰色空间,我们将不胜感激。
通过创建一个不可见的背景节点并将其zPositon 1设置得更少,我现在可以单击灰色空间并将其注册为背景节点,而不是框。
let bkgSize = CGSize(width: 1000, height: 1000)
let bkg = Bkg(color: .gray, size: bkgSize)
bkg.isUserInteractionEnabled = true
bkg.zPosition -= 1
addChild(bkg)
但是,在没有背景节点的情况下,为什么这个空的空间触摸被注册为盒子触摸?
答案 0 :(得分:2)
根据我对边界如何为父对象工作的理解,我认为这是正在发生的事情......
这有点相关,可能有助于理解为什么会这样,以及为什么Apple认为这是父母及其子女应该如何使用累积(组合)矩形/四边形进行触摸响应:
答案 1 :(得分:2)
你完全正确的背景节点按预期工作,没有背景精灵,它会给出@Confused所描述的结果。通过微调TouchesBegan函数,我能够在没有背景的情况下按预期工作......
class Box: SKSpriteNode {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch! {
let touchLocation = touch.location(in: parent!)
if frame.contains(touchLocation) {
print("touched box")
}
}
}
}
class Line: SKSpriteNode {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch! {
let touchLocation = touch.location(in: parent!)
if frame.contains(touchLocation) {
print("touched line")
}
}
}
}