2个节点发生冲突时出错

时间:2015-01-18 22:15:36

标签: swift sprite-kit collision-detection skphysicsbody

当2个节点发生碰撞时,我一直收到错误,这是我用于碰撞检测的代码:

func didBeginContact(contact: SKPhysicsContact!) {

    var firstBody:SKPhysicsBody
    var secondBody:SKPhysicsBody

    if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    }else{
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }


        if((firstBody.categoryBitMask & coin2Category) != 0 && (secondBody.categoryBitMask & playerCategory) != 0){
            var bodyAAC = contact.bodyA.node as SKSpriteNode //error pointing at this line: fatal error: unexpectedly found nil while unwrapping an optional value
            if CGRectIntersectsRect(kikker.frame, bodyAAC.frame) {
                coinslos = coinslos + 10
                coinlabel.text = "\(coinslos)"
                bodyAAC.removeFromParent()
                coinSound()
            }
        }
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

首先避免崩溃

此:

        var bodyAAC = contact.bodyA.node as SKSpriteNode
        if CGRectIntersectsRect(kikker.frame, bodyAAC.frame) {
            coinslos = coinslos + 10
            coinlabel.text = "\(coinslos)"
            bodyAAC.removeFromParent()
            coinSound()
        }

应改为:

        if let bodyAAC = contact.bodyA.node as? SKSpriteNode {
            if CGRectIntersectsRect(kikker.frame, bodyAAC.frame) {
                 coinslos = coinslos + 10
                 coinlabel.text = "\(coinslos)"
                 bodyAAC.removeFromParent()
                 coinSound()
            }
        }

在尝试使用它们之前,您需要检查选项。

然而rakeshbs是正确的。在捕获的任何碰撞中,bodyA.node都不是SKSpriteNode。我不知道您的代码的具体细节,但您没有使用或访问任何特定于SKSpriteNode的属性/方法。

您可以尝试更改:

            if let bodyAAC = contact.bodyA.node as? SKSpriteNode {

要:

            if let bodyAAC = contact.bodyA.node {

如果仍然不起作用,那么看起来bodyA根本不会附加到任何节点。