尝试加载skspritenode两次后应用程序崩溃?

时间:2017-01-15 04:43:43

标签: swift xcode sprite-kit swift3

之前我问了一个问题,我最后删除了它,因为我虽然想出来了,但实际上我只是把它缩小了。

当我的一个节点遇到障碍物时,游戏会显示一个分数标签和一个重启按钮。但是如果我的节点在初始命中后遇到另一个对象,则应用程序崩溃。如果我在标签前面用//运行游戏并重新启动以使它们脱离等式,游戏运行正常,但如果我与它们一起运行游戏,它就会崩溃。

这让我相信它的崩溃,因为它试图加载重启按钮和得分标签两次。我可能完全错了,但我怎么能纠正这个?

2 个答案:

答案 0 :(得分:1)

我认为你可能是对的。

尝试addchild是我认为你在场景中添加东西的方式。如果您尝试将某些内容添加到已添加到某个内容的场景或对象中,则会出现崩溃。

所以你可能会尝试将你的重启和分数标签添加到某个东西,就像孩子一样,当他们已经拥有父母时,这会导致崩溃。

答案 1 :(得分:0)

解决了!

我添加了if语句,使应用程序仅在1次碰撞后运行我的碰撞代码,而不是2

var collision = Int()


    func didBegin(_ contact: SKPhysicsContact) {
        var firstBody : SKPhysicsBody = contact.bodyA
        var secondBody : SKPhysicsBody = contact.bodyB

        if collision == 0{
        if ((firstBody.categoryBitMask == physicsCatagory.bird) && (secondBody.categoryBitMask == physicsCatagory.obstacle)) {

            collisionWithObstacle(bird: firstBody.node as! SKSpriteNode)
        }
        }
        else if collision != 0{
            if ((firstBody.categoryBitMask == physicsCatagory.bird) && (secondBody.categoryBitMask == physicsCatagory.obstacle)) {

        }
        }
    }


   func collisionWithObstacle(bird:SKSpriteNode){


        collision = collision+1
        scoreTimer.invalidate()
        obstacleTimer.invalidate()
        addChild(restart)
        scoreLabel2.text = "Score: \(score1)"
        addChild(scoreLabel2)

    }

希望这可以帮助别人,因为虽然事后看起来似乎微不足道,但在下班后的几个晚上,这是一个令人头疼的问题。