来自Texture的SKPhysicsBody在Spritekit中给出冲突空值

我正在创build一个angular色跳跃和收集点(一些对象)的游戏。 当你点击字符从阿特拉斯执行一些animation。 当它触及分数时,分数提高1.我使用SKTexture来创buildangular色的物理体。 当我的angular色触及到这个点时,它会崩溃,并向我显示这个错误

fatal error: unexpectedly found nil while unwrapping an Optional value 

//码

  Cat = SKSpriteNode(imageNamed: "cat"); Cat.size = CGSize(width: 100, height: 100) Cat.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2) //physics Cat.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "cat"), size:CGSizeMake(100, 100)) 

但是,如果我从矩形或圆形创buildPhysicsbody它工作得很好。 也许是用我用来激活我的angular色的地图集。

 Cat.physicsBody = SKPhysicsBody(circleOfRadius: self.frame.width/2) 

当angular色碰到蘑菇时,它会崩溃。 工作演示: https //github.com/nak1b/demo-game-error

你的代码的问题是, didBeginContact被多次调用…你可以通过在这个if语句中join一个print()语句来检查。

正如你所知道的,一个SKPhysicsBody对象有一个名为node的属性。 这是一个可选属性。 它代表了这个机构所连接的节点。 在你的情况下,这是一个蘑菇节点。

因此,当第一次调用didBeginContact时,因为您从其父项中删除了一个蘑菇节点, bodyA.node变为nil 。 下一次做bodyA.node!.removeFromParent()会产生一个崩溃,因为,正如我所说的, bodyA.node现在是零,但是你正在使用强制解包来访问一个可选的基础值。

只有当您100%肯定基础值不为零(或者如果您在开发阶段期间有意引发错误),才使用强制解包。 否则使用可选的绑定或可选的链接。 喜欢这个:

 func didBeginContact(contact: SKPhysicsContact) { var firstBody, secondBody: SKPhysicsBody //Do this to avoid double checking if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { firstBody = contact.bodyA secondBody = contact.bodyB } else { firstBody = contact.bodyB secondBody = contact.bodyA } //No need for double-checking now if ((firstBody.categoryBitMask & PhysicsCategory.Panda) != 0 && (secondBody.categoryBitMask & PhysicsCategory.Score != 0)) { //This will fail gracefully if node property is nil secondBody.node?.removeFromParent() } }