在展开可选值时意外发现 nil - Sprite Kit

unexpectedly found nil while unwrapping an Optional value - Sprite Kit

大家好,我的 Sprite Kit 游戏有一个大问题。我是新手,我正在尝试做一种小行星游戏,只是为了锻炼我学到的东西。

我的问题是,我的小行星是无限的,除非玩家被击中,否则它们不会停止。我的代码如下:

对于流星:

  func addMeteor() {

        let bigMeteor = SKSpriteNode(imageNamed: "meteor1")

        let bigMeteorAux = bigMeteor
        let sizeX = UInt32(CGRectGetMaxX(self.frame))
        let randomX = CGFloat(arc4random_uniform(sizeX))
        var impulse : CGVector!

        bigMeteorAux.position = CGPoint(x: randomX, y: size.height + 100)
        impulse = CGVector(dx: 0, dy: -30)
        bigMeteorAux.physicsBody = SKPhysicsBody(texture: bigMeteor.texture, size: bigMeteor.size);
        bigMeteor.physicsBody?.affectedByGravity = false
        bigMeteor.physicsBody?.allowsRotation = false
        bigMeteorAux.physicsBody?.friction = 0.0
        bigMeteorAux.physicsBody!.categoryBitMask = CollisionCategoryAsteroids
        bigMeteorAux.name = "Asteroid"

        foregroundNode!.addChild(bigMeteorAux)

        bigMeteorAux.physicsBody!.applyImpulse(impulse)

    }

我用一个动作调用函数:

   runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(addMeteor),
            SKAction.waitForDuration(1.0)
            ])
        ))

完美到现在,游戏运行正常。这是播放器代码:

    playerNode = SKSpriteNode(imageNamed: "spaceshipv2")
    playerNode!.physicsBody = SKPhysicsBody(texture: playerNode!.texture, size: playerNode!.size);
    playerNode!.xScale = 0.5
    playerNode!.yScale = 0.5
    playerNode!.position = CGPoint(x: size.width / 2.0, y: 220.0)
    playerNode!.physicsBody!.linearDamping = 1.0
    playerNode!.physicsBody!.allowsRotation = false
    playerNode!.physicsBody?.affectedByGravity = false
    playerNode!.physicsBody!.categoryBitMask = CollisionCategoryPlayer
    playerNode!.physicsBody!.contactTestBitMask =
        CollisionCategoryAsteroids
    playerNode!.name = "Player"
    //addChild(playerNode!)
    foregroundNode!.addChild(playerNode!)

最后一个联系方式:

    func didBeginContact(contact: SKPhysicsContact) {

        var nodeB = contact.bodyB!.node!

        if nodeB.name == "Asteroid"  {

            println("Touched")
            nodeB.removeFromParent()
        }

    }

所以我的问题从 nodeB 开始,出于某种原因有时当小行星撞击玩家时这段代码工作正常但其他时候当小行星撞击玩家时游戏崩溃并且我得到

fatal error: unexpectedly found nil while unwrapping an Optional value

程序进入联系人功能后

关于如何解决这个问题的任何想法或解决方案?多谢! =)

崩溃来自两个强制展开调用之一:bodyB!node!。通过这样写,你断言你确定他们永远不会 nil

找到其中一个为零的情况的方法是将代码分解成可以使用断点检查的行。

var bodyB = contact.bodyB
if bodyB == nil {
    // breakpoint here
}
var nodeB = bodyB!.node
if nodeB == nil {
    // breakpoint here
}
if nodeB!.name = "Asteroid" // etc.

代码停止后,您可以检查对象并尝试找出它们 nil 的原因并解决问题。

我不确定为什么节点显示为 nil,但您可以通过不强制展开 nil 值来避免崩溃:

if let nodeB = contact.bodyB?.node?
    if nodeB.name == "Asteroid"  {
        println("Touched")
        nodeB.removeFromParent()
    }
}

如果这些可选值可以成功解包,那段代码只会运行。