我正在制作一个玩家(球)和敌人(球)互相碰撞的游戏。有时候会有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'? –