我在这行代码中不断收到SIGBRT错误:
let spriteTapped : SKSpriteNode = (nodeTapped as? SKSpriteNode)!
我正在使用它来检查我的Sprite是否被点击以及哪个Sprite被点击,只要点击了除SKSpriteNode之外的任何东西,我都会收到此错误,有关如何解决此问题的任何想法?
答案 0 :(得分:0)
如果nodeTapped
是不是 a SKSpriteNode
,则条件转换
nodeTapped as? SKSpriteNode
计算结果为nil
,并且用!
强制展开会崩溃。
最好使用可选绑定:
if let spriteTapped = nodeTapped as? SKSpriteNode {
// ... do something with spriteTapped ...
} else {
// tapped node is not a SKSpriteNode
}
或
guard let spriteTapped = nodeTapped as? SKSpriteNode else {
return // tapped node is not a SKSpriteNode
}
// ... do something with spriteTapped ...
如果您有一个数组个节点,则
for case let spriteTapped as SKSpriteNode in nodesTapped {
// ... do something with spriteTapped ...
}
可用于遍历列表中的所有sprite节点(和 默默地忽略其他节点。
答案 1 :(得分:0)
@Martin R 的答案是完全正确的。
让我添加更多有关检测哪些节点或精灵已被窃听的详细信息。
如果将其添加到场景中
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let tappedNodes = nodes(at: location)
let tappedSprites = tappedNodes.compactMap { $0 as? SKSpriteNode }
}
您可以轻松获取具有相同触摸坐标的所有节点(tappedNodes
)和子画面(tappedSprites
)的列表。