我正在用SpriteKit创建一个游戏,它有两个物体之间的碰撞。设立机构后,我已经实现了didBegin(_contact:)
moethod如下图所示:SKPhysics的扩展名联系人崩溃
func didBegin(_ contact: SKPhysicsContact) {
if contact.bodyA.categoryBitMask == 0 && contact.bodyB.categoryBitMask == 1 {
gameOver()
}
}
它完美地工作。
以后,当inspecrting此方法的文档,我发现:
The two physics bodies described in the contact parameter are not passed in a guaranteed order.
所以要在安全方面,我已经延长了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 bodiesAreFromCategories:and:]: unrecognized selector sent to instance 0x60000028b950
2017-07-18 13:44:18.563 iSnake Retro[17606:735367] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PKPhysicsContact bodiesAreFromCategories:and:]: unrecognized selector sent to instance 0x60000028b950'
权力正确设置你的面具,这是一个很酷的扩展,但通常你只需要添加该类别一起掩盖以完全避免这个问题。 – Fluidity
@Fluidity你的意思是将两个值都替换为'0 | 1'?如果是的话,这是完全不可能的,因为同一类别的两个物体之间的碰撞产生与来自两个不同类别的物体不同的作用 – Fayyouz
否,请参阅我的答案。您将类别掩码添加到一起以获得唯一的总和。你必须设置你的面具在两个权力为此工作。 2 + 2总是等于4,并且2 + 4总是等于6,即使它是4 + 2 – Fluidity