Sprite Kit碰撞错误- Swift



我是IOS开发新手,目前在didBeginContact方法中的sprite kit碰撞方面存在一些问题。

如果其中一个碰撞物理体被移除,我如何打破或停止didBeginContact运行。例如:1颗子弹与2个重叠的敌人相撞因为子弹击中了敌人1并被摧毁,在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。

我已经尝试检查nil和NSNULL值没有运气。我收到的错误代码是"线程1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOIP,subcode=0x0)",并在尝试检查类别位掩码时发生(因为鱼雷不再存在)。

代码:

    var bodyA:SKPhysicsBody = contact.bodyA
    var bodyB:SKPhysicsBody = contact.bodyB

    if(contact.bodyA.categoryBitMask == alienCategory && contact.bodyB.categoryBitMask == alienCategory){
        return
    }

    if((bodyA.categoryBitMask == alienCategory) && (bodyB.categoryBitMask == photonTorpedoCategory)){
        torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)
    }
    var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
    var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode
    currTorpedo.removeFromParent()
    currAlien.removeFromParent()

}
func torpedoDidCollideWithAlien(alien:SKSpriteNode){
    aliensDestroyed++
    label.text = ("Current Score: " + String(aliensDestroyed))

}

也许你可以推迟从现场移除鱼雷,直到下一个场景"更新"。你可以将鱼雷标记为禁用/无效,这样它就不会影响你的第二个重叠敌人。像这样:

class YourScene: SkScene {
    // Array of disabled torpedos
    var disabledTorpedos = SKSpriteNode()[]
    func didBeginContact(contact: SKPhysicsContact) {
        var bodyA:SKPhysicsBody = contact.bodyA
        var bodyB:SKPhysicsBody = contact.bodyB

        if(contact.bodyA.categoryBitMask == alienCategory && contact.bodyB.categoryBitMask == alienCategory){
            return
        }

        if((bodyA.categoryBitMask == alienCategory) && (bodyB.categoryBitMask == photonTorpedoCategory)){
            torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)
        }
        var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
        var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode
        // Created a new photonTorpedoDisabledCategory so the torpedo cannot hit a 2nd alien
        currTorpedo.physicsBody.categoryBitMask = photonTorpedoDisabledCategory
        disabledTorpedoes.append(currTorpedo)
        // Hide torpedo from scene
        currTorpedo.hidden = true
        currAlien.removeFromParent()
    }
    override func update(currentTime: NSTimeInterval) {
        // loop through disabledTorpedos array and removeFromParent
    }
 }

相关内容

最新更新