我正在用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