xcode中的三体碰撞检测问题

时间:2016-08-17 08:30:14

标签: swift collision-detection collision

我遇到三个身体一次碰撞并且崩溃我的应用程序时罕见的问题。身体1和身体2或身体1和身体3之间的碰撞检测工作得很好(身体2和身体3碰撞并不重要,并且可以直接穿过彼此),只要这三个身体不会碰巧碰撞。当发生这种情况时,我会收到这些错误:

  

致命错误:在展开可选值时意外发现nil

  

thread1:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0

非常感谢任何帮助。相关代码如下。

 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 & PhysicsCategory.Enemy != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.Star != 0)) {
        starDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
    }

    if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.Flyer != 0)) {
        flyerDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
    }

也许有一种方法可以添加第三个身体?或者某种方法可以检测出2个身体接触另一个身体的情况?

如果我没有删除其中一个碰撞对象,我知道问题已经消除了。这对游戏来说并不理想,所以我希望能够消除这种崩溃并仍然删除所有碰撞对象。也许从父母那里删除所有涉及的东西?

1 个答案:

答案 0 :(得分:0)

所以,我认为这是发生了什么。

当您强制打开包含nil的可选项时,会出现运行时错误。并且,在你的代码片段中,firstBody和secondBody被强制解开(因为它们的类型注释上有&#39;!&#39;)。

我假设starDidCollideWithEnemy从场景中删除firstBody或secondBody。否则就会把它们弄掉。

然后,在双重碰撞的情况下,将评估下一个if块。但是,无论是firstBody还是secondBody已经是零 - 所以整个事情都会爆发。

也许最简单的方法是评估第一个测试中的第二个测试。

    if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.Star != 0)) {
        starDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
    }

    else if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.Flyer != 0)) {
        flyerDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
    }