Ошибка столкновения набора спрайтов — Swift

#ios #exception-handling #sprite-kit #collision-detection

#iOS #обработка исключений #sprite-kit #обнаружение столкновения

Вопрос:

Я новичок в разработке IOS, и в настоящее время у меня возникают некоторые проблемы с столкновениями наборов спрайтов в методе didBeginContact.

Как мне выйти из или остановить запуск didBeginContact, если одно из сталкивающихся физических тел удалено. например: 1 пуля сталкивается с 2 перекрывающимися врагами. Поскольку пуля попадает в первого врага и уничтожается, проверка столкновения, выполняемая на втором враге, выдает исключение, поскольку пуля больше не существует.

Я безуспешно пытался проверить значения 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 amp;amp; contact.bodyB.categoryBitMask == alienCategory){
        return
    }


    if((bodyA.categoryBitMask == alienCategory) amp;amp; (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))


}
  

Ответ №1:

Возможно, вы могли бы отложить удаление торпеды со сцены до следующего обновления сцены. Вы можете пометить торпеду как отключенную / неактивную, чтобы она не влияла на вашего 2-го перекрывающегося врага. Что-то вроде этого:

 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 amp;amp; contact.bodyB.categoryBitMask == alienCategory){
            return
        }


        if((bodyA.categoryBitMask == alienCategory) amp;amp; (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

    }

 }