在Swift

时间:2015-10-18 15:23:42

标签: ios swift sprite-kit swift2

我每次尝试通过创建新场景来调用此功能时,我都会尝试将游戏重置为开始屏幕:

func restart() {
    let newScene = GameScene(size: view!.bounds.size)
    newScene.scaleMode = .AspectFill

    view!.presentScene(newScene)
}

第一次调用时,它可以正常工作。但是,第二次调用时,我得到一个(显然非常常见的)错误:

  
    

致命错误:在解包可选值时意外发现nil

  

我不明白为什么我在这种情况下收到此错误。

有没有更好的方法来重新加载整个GameScene?我是否需要对旧的GameScene实例做任何事情?

1 个答案:

答案 0 :(得分:1)

您可能已在GameScene课程中定义了此方法,对吗?

让我们看看API文档对view SKScene属性的说明。

  

当前呈现场景的视图。 (只读)To   出现一个场景,你调用presentScene:方法或   presentScene:transition:SKView类的方法。如果场景是   目前尚未显示,此属性包含 nil

所以我猜你在从视图中删除了当前场景之后调用了这个方法。

有没有更好的方法来重新加载整个GameScene?

这种方法是正确的,但您应该在之前调用restart 当前场景已从视图中移除,否则它没有引用您的view

我是否需要对旧的丢弃GameScene实例执行任何操作?

不。

使用新场景替换当前场景后,如果您没有对旧场景的强引用,ARC会将其从内存中删除。

为了确保删除当前场景,您有几个简单的工具:

1。调试导航器

在游戏开始运行时,请在Xcode的Debug Navigator处查看 + 6 ,然后多次调用restart。 如果使用的内存指示器长大,那么可能您没有从内存(或其他某个对象)释放GameScene

enter image description here

  

不释放GameScene是视频游戏中可能发生的最糟糕的事情之一,因为场景(直接或间接)保存对当前级别/屏幕中每个其他节点的引用。它发生在我的游戏开发过程中,所以我知道我在说什么:D

2。 DEINIT

deinit方法添加到GameScene

class GameScene : SKScene {
    deinit {
        print("The GameScene has been removed from memory")
    }
}
从内存中删除对象时会自动调用

deinit。现在,每次重新启动场景时,都应该看到消息

GameScene已从内存中移除

来自 dead 场景的控制台上的