如何将.sks文件添加到现有的Swift / Sprite-Kit项目?

我开始关注Ray Wenderlich的“太空入侵者”教程,但是分歧很大。 我现在有3个SKScenes – 我的标题屏幕,我的主要游戏屏幕和我的结束水平/游戏在屏幕上。 我添加的标题屏幕和结束游戏场景,这些都有.sks文件; 主游戏屏幕不会显示所有元素(SKSpriteNodes等)。 我的程序stream程如下:

在这里输入图像说明

我现在真的想通过场景编辑器放置主游戏屏幕的一些事件,所以我为它创build了一个.sks文件,并试图改变我的titleScene.swift,如下所示:

从:

let gameScene = GameScene(size:CGSize(width: 1536, height: 2048)) 

至:

  let gameScene = SKScene(fileNamed: "GameScene.sks") as! GameScene! 

但是,这会给出:

在这里输入图像说明

我试图删除required init(coder aDecoder: NSCoder)但Xcode然后抱怨说

所需的init(编码器:必须由SKScene的子类提供

然而我的titleScenegameOverScene也是gameOverScene的子类,他们没有init(coder 🙂

我真的不能看到我在做什么显示我的titleScreen和我的gameOverScene通过(fileNames :)和他们的.sks文件,并尝试做我的gameScene相同的区别。

你得到所需的原因是因为你有variables是不可选的或在init发生之前未初始化。

如果你需要在init函数中分配variables,那么你可以这样做:

 required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } 

但是,那么你会问我:Knight0fDragon先生,它告诉我要用coderreplacefileNamed ,并且在我切换时不编译。

那么这是因为init(fileNamed:)是一个方便的init,而不是一个指定的init。 为了能够inheritance一个类并获得它所有的便利,你需要覆盖它所有的指定inits。

现在用SKScene,你有3,而你已经知道了1。

我们重写另一个2:

 override init() { super.init() } override init(size: CGSize) { super.init(size: size) } 

好吧,现在这个小狗应该准备好编译了,我们只需要获得分配的variables。

那么我喜欢做的是创build一个设置方法的任何variables必须分配在任何版本的初始化超级被调用后。

不幸的是,我们不能在super调用之前为常量做这些事情,所以我们需要在每个方法中设置它们。 原因是self还没有完全存在。

这最终会看起来像这样:

 let constant : String required init?(coder aDecoder: NSCoder) { constant = "hi" super.init(coder: aDecoder) setup() } override init() { constant = "hi" super.init() setup() } override init(size: CGSize) { constant = "hi" super.init(size: size) setup() }