Ios 不解除分配的场景

Ios 不解除分配的场景,ios,swift,sprite-kit,skscene,skview,Ios,Swift,Sprite Kit,Skscene,Skview,我正在制作一款SpriteKit游戏,我遇到了很多麻烦。第一个屏幕是一个菜单,当您单击play(播放)按钮时,玩家将使用以下代码进入游戏: override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { for touch in touches { let location:CGPoint = touch.locationInNode(self) if self.nodeAtPo

我正在制作一款SpriteKit游戏,我遇到了很多麻烦。第一个屏幕是一个菜单,当您单击play(播放)按钮时,玩家将使用以下代码进入游戏:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        let location:CGPoint = touch.locationInNode(self)
        if self.nodeAtPoint(location).name == "play" {
            playButton.fontColor = colorPressed
            var scene = PlayScene(size: self.size)
            let skView = self.view! as SKView
            skView.ignoresSiblingOrder = true
            skView.showsFPS = false
            skView.showsNodeCount = false
            scene.scaleMode = .AspectFill
            gameStart(scene, skView: skView)
        }
    }
}

func gameStart(scene:SKScene, skView:SKView) {
    let scale = SKAction.scaleTo(0.0, duration: 0.17)
    about.runAction(scale, completion: {
        self.scene?.removeAllChildren()
        self.scene?.removeFromParent()
        skView.presentScene(scene)
    })
}
(PlaySecene是玩家玩游戏的场景)此转换工作正常。这名运动员能够很好地进行比赛。接下来,当玩家输掉游戏时,我使用以下代码转到场景上方的游戏:

func lineHitBadDot(dot: SKSpriteNode) {
    var sceneGG = OverScene(size: self.size)
    let skViewGG = self.view! as SKView
    skViewGG.ignoresSiblingOrder = true
    skViewGG.showsFPS = false
    skViewGG.showsNodeCount = false
    sceneGG.scaleMode = .AspectFill
    let scale = SKAction.scaleTo(0.0, duration: 0.17)
    scoreCounter.runAction(scale, completion: {
        self.scene?.removeAllChildren()
        self.scene?.removeFromParent()
        skViewGG.presentScene(sceneGG)
    })
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        let location:CGPoint = touch.locationInNode(self)
        if self.nodeAtPoint(location).name == "retry" {
            var sceneCookie = PlayScene(size: self.size)
            let skViewCookie = self.view! as SKView
            skViewCookie.ignoresSiblingOrder = true
            skViewCookie.showsFPS = false
            skViewCookie.showsNodeCount = false
            sceneCookie.scaleMode = .AspectFill
            gameStart(sceneCookie, skViewD: skViewCookie)
        }
        else if self.nodeAtPoint(location).name == "menu" {
            var sceneCookieB = GameScene(size: self.size)
            let skViewCookieB = self.view! as SKView
            skViewCookieB.ignoresSiblingOrder = true
            skViewCookieB.showsFPS = false
            skViewCookieB.showsNodeCount = false
            sceneCookieB.scaleMode = .AspectFill
            gameStart(sceneCookieB, skViewD: skViewCookieB)
        }
    }
}

func gameStartE(sceneD:SKScene, skViewD:SKView) {
    let scale = SKAction.moveToY(self.size.height + 300, duration: 0.17)
    homeB.runAction(scale, completion: {
        self.scene?.removeAllChildren()
        self.scene?.removeFromParent()
        skViewD.presentScene(sceneD)
    })
}
(OverScene是游戏结束场景)然后,玩家有两个选项,重试或返回菜单场景。这将使用以下代码:

func lineHitBadDot(dot: SKSpriteNode) {
    var sceneGG = OverScene(size: self.size)
    let skViewGG = self.view! as SKView
    skViewGG.ignoresSiblingOrder = true
    skViewGG.showsFPS = false
    skViewGG.showsNodeCount = false
    sceneGG.scaleMode = .AspectFill
    let scale = SKAction.scaleTo(0.0, duration: 0.17)
    scoreCounter.runAction(scale, completion: {
        self.scene?.removeAllChildren()
        self.scene?.removeFromParent()
        skViewGG.presentScene(sceneGG)
    })
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        let location:CGPoint = touch.locationInNode(self)
        if self.nodeAtPoint(location).name == "retry" {
            var sceneCookie = PlayScene(size: self.size)
            let skViewCookie = self.view! as SKView
            skViewCookie.ignoresSiblingOrder = true
            skViewCookie.showsFPS = false
            skViewCookie.showsNodeCount = false
            sceneCookie.scaleMode = .AspectFill
            gameStart(sceneCookie, skViewD: skViewCookie)
        }
        else if self.nodeAtPoint(location).name == "menu" {
            var sceneCookieB = GameScene(size: self.size)
            let skViewCookieB = self.view! as SKView
            skViewCookieB.ignoresSiblingOrder = true
            skViewCookieB.showsFPS = false
            skViewCookieB.showsNodeCount = false
            sceneCookieB.scaleMode = .AspectFill
            gameStart(sceneCookieB, skViewD: skViewCookieB)
        }
    }
}

func gameStartE(sceneD:SKScene, skViewD:SKView) {
    let scale = SKAction.moveToY(self.size.height + 300, duration: 0.17)
    homeB.runAction(scale, completion: {
        self.scene?.removeAllChildren()
        self.scene?.removeFromParent()
        skViewD.presentScene(sceneD)
    })
}
返回菜单或重新尝试游戏时,问题会出现。返回菜单时,我看到一个空白屏幕,这意味着按钮已设置动画,因此它将显示初始菜单场景,而不是取消分配旧场景,并创建一个我希望的新场景。当重新尝试游戏时也会发生同样的事情,它会带回旧场景,而不是重新分配并创建新场景。我在互联网上到处寻找,没有找到解决这个问题的办法。非常感谢您的帮助


谢谢。

删除removeAllChildren和removeFromParent行,它们是不必要的,如果您试图将场景从不存在的父场景中删除,谁知道场景会发生什么。除此之外,使用仪器和分析构建来查找泄漏。@LearnCos2D我之前尝试过,但仍然不起作用。