我遇到三个身体一次碰撞并且崩溃我的应用程序时罕见的问题。身体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个身体接触另一个身体的情况?
如果我没有删除其中一个碰撞对象,我知道问题已经消除了。这对游戏来说并不理想,所以我希望能够消除这种崩溃并仍然删除所有碰撞对象。也许从父母那里删除所有涉及的东西?
答案 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)
}