2016-10-01 29 views
2

我开始关注Ray Wenderlich的“太空侵略者”教程,但已大大分化。我现在有3个SKScenes - 我的标题屏幕,我的主要游戏屏幕和我的终端级别/屏幕上的游戏。我添加的标题屏幕和结束游戏场景以及这些都具有.sks文件;主游戏画面不是,所有元素(SKSpriteNodes等)都以编程方式放置。我的程序的流程如下:如何将.sks文件添加到现有的Swift/Sprite-Kit项目?

enter image description here

我现在实际上想要通过场景编辑器中放置游戏主画面的一些事件,所以我创建了一个.sks文件,并将其试图改变我titleScene.swift如下:

来自:

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

到:

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

然而,这则给出:

enter image description here

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

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

的供应

但是我的titleScenegameOverScene也是SKScene的子类,它们没有init(编码器:)

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

+0

尝试这样的:如果让gameScene = GameScene(fileNamed: “GameScene”){} – Whirlwind

+0

现在,我得到:“在调用不正确的参数(有“文件名:',expected'size:')。我很确定有一些简单的我错过了... –

+0

当从.sks加载场景时,不使用InitWithSize。我不明白为什么你在你的GameScene?删除它,并删除编码器的init的实现,它将工作。 – Whirlwind

回答

3

你得到所需的原因是你的变量不是可选的,或者在init发生之前没有初始化。

如果您有需要的初始化函数中被赋值的变量,那么你会怎么做:

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

但你会问我:Knight0fDragon先生,它告诉我coder更换fileNamed ,当我切换它时,它不会编译。

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

现在有了SKScene,你有3个,并且你已经知道1.

让我们来覆盖其他2:

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

好了,现在这只小狗应该是可以编译,我们只需要获取分配的变量。

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

不幸的是,我们不能在超级被调用之前为常量做到这一点,所以我们需要在每种方法中设置这些参数。原因是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() 
} 
+0

优秀 - 修复它。非常感谢。所以我的gameScene和TitleScene/gameOverScene之间的区别是,只有gameScene有未初始化的存储属性。我知道Swift的初始化听起来有点棘手(它可能不是一旦你明白了),但从来没有反对过它。 –

+0

准确地说,你会习惯它 – Knight0fDragon

+0

下面是一个非常好的例子,你开始向读者介绍Swift中初始化如何以及为什么是如此重要的一个大规模的洞察力和理解(并因此赋予权力)! – Confused

相关问题