我正在製作一個玩家(球)和敵人(球)互相碰撞的遊戲。有時候會有didBegin
func保存關於兩個相撞機體的信息,有時候不會導致崩潰並拋出exc_bad_instruction
的錯誤,然後我用斷點檢查玩家和敵人,我發現它們是nil
。這種情況如何發生,有時會起作用,有時不起作用。請幫忙。爲什麼didBegin沒有關於聯繫人的數據?
我的代碼:
private var player: Player!
private func drawPlayer(color: SKColor, radius: CGFloat, cn: String) {
player = Player.factory.createPlayer(color: color, radius: radius)
player.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
player.name = cn
world.addChild(player)
}
if (contact.bodyA.categoryBitMask == bodyType.enemy.rawValue) && (contact.bodyB.categoryBitMask == bodyType.player.rawValue) {
print(contact.bodyA.node?.name)
print(contact.bodyB.node?.name)
let player = contact.bodyB.node as? Player
let hitter = contact.bodyA.node as? Enemy
}
我使用的打印得到的名字有時給我兩個名字,有時它給了我兩個nil
。剩下的代碼我沒有把它放在這裏,因爲它不是必需的。
的解::
如史蒂夫在他的回答中提到的問題是,有時didBegin
方法被調用於同一碰撞物體的兩倍。所以它崩潰了,因爲在第一次調用時我刪除了對象,所以它第二次發現nil
。所以史蒂夫提到你應該用if
包圍邏輯並檢查兩個物體是否爲nil
然後這是didBegin
的第二個調用,並且對象已經被刪除,所以你不應該運行邏輯,否則它將在沒有運行時崩潰。如果他們不是nil
,你可以運行代碼,它的工作原理。
是的,我使用刪除父母的敵人和玩家,然後我再次在同一個地方,以便遊戲繼續,但它適用於它的前3或2次,然後崩潰在後來崩潰 –
我懷疑你需要指出這個碰撞已經被處理了。你可以在userData中設置一個標誌,然後在update()中清除該標誌,因爲到那時你將在一個新的遊戲循環中,並且玩家和敵人之間的衝突將是新的。 –
你的意思是我在他們開始碰撞後添加變量'collided = true'? –