投射为sksprite节点

时间:2018-08-21 08:22:24

标签: ios swift sprite-kit

我在这行代码中不断收到SIGBRT错误:

let spriteTapped : SKSpriteNode = (nodeTapped as? SKSpriteNode)!

我正在使用它来检查我的Sprite是否被点击以及哪个Sprite被点击,只要点击了除SKSpriteNode之外的任何东西,我都会收到此错误,有关如何解决此问题的任何想法?

2 个答案:

答案 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)的列表。