转换回 gamescene.swift 会导致错误“'尝试添加一个已经有父节点的 SKNode”

Posted

技术标签:

【中文标题】转换回 gamescene.swift 会导致错误“\'尝试添加一个已经有父节点的 SKNode”【英文标题】:Transitioning back to gamescene.swift causes error "'Attemped to add a SKNode which already has a parent"转换回 gamescene.swift 会导致错误“'尝试添加一个已经有父节点的 SKNode” 【发布时间】:2015-02-25 06:12:39 【问题描述】:

我的应用包含两个场景。 Playscene.swift 和 gamescene.swift。

从游戏场景过渡到游戏场景(游戏发生的地方)效果很好。但是,一旦游戏结束,我就会出现一个“重播”按钮,允许用户返回到 gamescene.swift。在转换回来时,它会因错误“尝试添加已经有父节点的 SKNode”而崩溃。是否有正确的方法可以转换回主屏幕或重新启动游戏,这样我就不会收到错误消息?谢谢大家的帮助!!

if self.nodeAtPoint(touchLocation) == self.replay 

        let scene = GameScene(size: self.size)
        let skView = self.view as SKView!
        scene.size = skView.bounds.size

        self.view?.presentScene(scene)

        let transition = SKTransition.crossFadeWithDuration(1.0)
        transition.pausesOutgoingScene = false
        skView.presentScene(scene, transition: transition)

    

Gamescene.swift 错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKLabelNode> name:'(null)' text:'Highscore:' fontName:'Avenir-Black' position:344, 549'

*** 首先抛出调用栈:

【问题讨论】:

完全偏离主题,但你的场景名称有点混乱。从名称来看,其中任何一个都可能是游戏发生的地方;) 哈哈是真的。这就是我的菜鸟(这是我的第一个应用) 【参考方案1】:

我觉得自己很愚蠢。我添加了一个断点并且没有注意。可以肯定地说该睡觉了。

【讨论】:

【参考方案2】:

你试图两次呈现相同的场景:

self.view?.presentScene(scene)

skView.presentScene(scene, transition: transition)

也许你不想这样做:

if self.nodeAtPoint(touchLocation) == self.replay 

    let skView = self.view as SKView!
    let scene = GameScene(size: skView.bounds.size)
    // Might also work with the following line instead :
    // let scene = GameScene(size: self.frame.size)

    let transition = SKTransition.crossFadeWithDuration(1.0)
    transition.pausesOutgoingScene = false

    self.view?.presentScene(scene, transition: transition)


【讨论】:

感谢您指出这一点,我不知道我是怎么错过的。但是,我仍然会崩溃。除了“class PlayScene: SKScene, SKPhysicsContactDelegate”行上的突出显示外,只显示没有错误。有没有正确的方法可以转换回我错过的游戏场景?【参考方案3】:

您可能在 GameScene class 之外声明 SKLabelNode,使 SKLabelNode 成为全局变量,您应该在类中声明它,以便在 scene A 转换为 scene B 时它会消失。

【讨论】:

以上是关于转换回 gamescene.swift 会导致错误“'尝试添加一个已经有父节点的 SKNode”的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8 SpriteKit:GameScene.swift 文件未被识别/运行

改变行为可能导致精度损失

从 JavaScript 添加 asp.net 下拉列表项会导致页面回发错误

spring事务会导致全局变量回滚么

如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误[重复]

如何在 GameScene 中从 ViewController 调用方法