【发布时间】:2017-01-30 13:48:22
【问题描述】:
我正在制作一个玩家(球)和敌人(球)互相撞击的游戏。有时didBegin func 保存有关两个碰撞体的信息,有时没有,这会导致崩溃并抛出exc_bad_instruction 的错误,然后我用断点检查玩家和敌人并找到它们nil。这是怎么发生的,有时它起作用,有时却不起作用。请帮忙。
我的代码:
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,您可以运行代码并且它可以工作。
【问题讨论】:
标签: ios swift sprite-kit collision-detection game-physics