当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()
}
}
}
我做错了什么?
答案 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根本不会附加到任何节点。