我每次尝试通过创建新场景来调用此功能时,我都会尝试将游戏重置为开始屏幕:
func restart() {
let newScene = GameScene(size: view!.bounds.size)
newScene.scaleMode = .AspectFill
view!.presentScene(newScene)
}
第一次调用时,它可以正常工作。但是,第二次调用时,我得到一个(显然非常常见的)错误:
致命错误:在解包可选值时意外发现nil
我不明白为什么我在这种情况下收到此错误。
有没有更好的方法来重新加载整个GameScene
?我是否需要对旧的GameScene
实例做任何事情?
答案 0 :(得分:1)
您可能已在GameScene
课程中定义了此方法,对吗?
让我们看看API文档对view
SKScene
属性的说明。
当前呈现场景的视图。 (只读)To 出现一个场景,你调用presentScene:方法或 presentScene:transition:SKView类的方法。如果场景是 目前尚未显示,此属性包含 nil 。
所以我猜你在从视图中删除了当前场景之后调用了这个方法。
这种方法是正确的,但您应该在之前调用restart
当前场景已从视图中移除,否则它没有引用您的view
。
GameScene
实例执行任何操作?不。
使用新场景替换当前场景后,如果您没有对旧场景的强引用,ARC会将其从内存中删除。
为了确保删除当前场景,您有几个简单的工具:
在游戏开始运行时,请在Xcode的Debug Navigator
处查看⌘ + 6 ,然后多次调用restart
。
如果使用的内存指示器长大,那么可能您没有从内存(或其他某个对象)释放GameScene
。
不释放GameScene是视频游戏中可能发生的最糟糕的事情之一,因为场景(直接或间接)保存对当前级别/屏幕中每个其他节点的引用。它发生在我的游戏开发过程中,所以我知道我在说什么:D
将deinit
方法添加到GameScene
class GameScene : SKScene {
deinit {
print("The GameScene has been removed from memory")
}
}
从内存中删除对象时会自动调用 deinit
。现在,每次重新启动场景时,都应该看到消息
GameScene已从内存中移除
来自 dead 场景的控制台上的。