ios - Sprite Kit 碰撞错误 - Swift

标签 ios exception-handling sprite-kit collision-detection

我是 IOS 开发新手,目前在 didBeginContact 方法中遇到一些 Sprite 工具包碰撞问题。

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

我曾尝试检查 nil 和 NSNULL 值,但没有成功。 我收到的错误代码是“Thread 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

    }

 }

关于ios - Sprite Kit 碰撞错误 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24401101/

相关文章:

ios - 控制台错误 : "react-native-maps" AirGoogleMaps dir must be added to your xCode project

android - Phonegap 的 IDE 是什么? Eclipse 够用吗?

ios - 将正确定位的图层添加到上下文

python - 无法通过请求捕获 ConnectionError

swift - 如何使用 SKAction 改变 SKSpriteNode 的位置

ios - 使 Sprite 出现在随机的 y 点

iphone - 将位置字符串作为参数从 iphone sdk 传递到 google places

exception-handling - .NET 中的全局异常处理?

java - 在 Java 中尝试/捕获

swift - 在 for 循环内等待 SKAction 完成