我有一个问题,罕见的情况下,三个机构同时碰撞和崩溃我的应用程序。Body1和Body2或Body1和Body3之间的碰撞检测非常有效(Body2和Body3碰撞无关紧要,可以直接通过对方),只要这三个物体不会同时发生碰撞。当这种情况发生时,我会得到这些错误:
致命错误:在展开可选值时意外找到nil
和
线程1:exc_bad_指令(代码=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)
}
也许有办法增加第三具尸体?或者用某种方法检测两个身体接触另一个身体的案例?
如果我不从父对象中移除一个碰撞的对象,就可以消除这个问题。但这对游戏来说并不理想,所以我希望能够消除这个崩溃,仍然删除所有碰撞对象。也许只是从父母那里移除所有相关内容?
最佳答案
所以,我想发生的是这个。
当您强制展开一个包含nil的可选项时,将发生您看到的运行时错误。而且,在您的代码片段中,firstbody和secondbody是根据定义强制展开的(因为“!”在它们的类型注释上)。
我假设星际与敌人相撞会把第一具尸体或第二具尸体从现场移走。否则会把他们消灭。
然后,在双碰撞的情况下,计算下一个if块。但无论是第一体还是第二体都已经是零了,所以整件事就爆炸了。
也许最简单的事情就是在第一个else块中评估第二个测试。
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)
}
关于swift - xcode中的三体碰撞检测问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38991686/