我正在用 SpriteKit 创建一个游戏,它在两个身体之间发生碰撞。设置好主体后,我实现了didBegin(_contact:)
如下所示的方法:
func didBegin(_ contact: SKPhysicsContact) {
if contact.bodyA.categoryBitMask == 0 && contact.bodyB.categoryBitMask == 1 {
gameOver()
}
}
它工作得很好。
后来,在检查此方法的文档时,我发现了以下内容:
接触参数中描述的两个物理体不是以保证的顺序传递的。
所以为了安全起见,我SKPhysicsContact
用一个函数扩展了这个类,在两个主体之间交换 categoryBitMask,如下所示:
extension SKPhysicsContact {
func bodiesAreFromCategories(_ a: UInt32, and b: UInt32) -> Bool {
if self.bodyA.categoryBitMask == a && self.bodyB.categoryBitMask == b { return true }
if self.bodyA.categoryBitMask == b && self.bodyB.categoryBitMask == a { return true }
return false
}
}
问题是当函数被调用时,应用程序崩溃,我收到以下错误:
2017-07-18 13:44:18.548 iSnake Retro[17606:735367]-[PKPhysicsContact bodyAreFromCategories:and:]:无法识别的选择器发送到实例 0x60000028b950
2017-07-18 13:44:18.563 iSnake Retro[17606:735367] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[PKPhysicsContact bodyAreFromCategories:and:]:无法识别的选择器发送到实例 0x60000028b950”