我开始关注雷·温德利希(Ray Wenderlich)的“太空侵略者”(Space Invaders)教程,但分歧很大。现在,我有3个SKScenes-我的标题屏幕,主游戏屏幕和结束级别/游戏结束屏幕。我添加的标题屏幕和结束游戏场景都具有.sks文件;游戏主屏幕上没有,并且所有元素(SKSpriteNodes等)都以编程方式放置。我的程序流程如下:
我现在实际上想通过场景编辑器放置游戏主屏幕上的一些事件,因此我为其创建了一个.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(coder:必须由SKScene的子类提供
但是mytitleScene
和gameOverScene
也是SKScene的子类,它们没有init(coder :)
我真的看不到通过(fileNames :)和它们的.sks文件显示titleScreen和gameOverScene以及尝试对gameScene进行相同操作的区别。
之所以得到要求,是因为在初始化发生之前,您的变量不是可选的或未初始化的。
如果您需要在init函数内部分配变量,则可以执行以下操作:
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
但你会问我:Knight0fDragon先生,它告诉我,以取代fileNamed
用coder
,当我打开它它不编译。
嗯,这是因为它init(fileNamed:)
是一个便利的初始化,而不是指定的初始化。为了能够继承一个类并获得所有便利的init,您需要重写所有指定的init。
现在有了SKScene,您就有3个,并且您已经知道1个。
让我们覆盖其他2:
override init() {
super.init()
}
override init(size: CGSize) {
super.init(size: size)
}
好了,现在这只小狗应该可以编译了,我们只需要获取分配的变量即可。
好吧,我想做的是为在调用super之后必须在初始化的任何版本中分配的任何变量创建一个设置方法。
不幸的是,在调用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()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句