[英]Xcode Swift sprite-kit SKS file animation works right in the SKS file, but doesn't work on the simulator or iPhone
[英]How to add an .sks files to existing Swift/Sprite-Kit project?
我开始关注雷·温德利奇(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的子类提供
但是我的titleScene
和gameOverScene
也是gameOverScene
的子类,它们没有init(coder :)
我真的看不到通过(fileNames :)和它们的.sks文件显示titleScreen和gameOverScene以及尝试对gameScene进行相同操作的区别。
之所以需要此条件,是因为在初始化发生之前,您的变量不是可选的或未初始化的。
如果您需要在init函数内部分配变量,则可以执行以下操作:
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
但是然后您会问我:Knight0fDragon先生,它告诉我用coder
替换fileNamed
,并且当我切换它时它没有编译。
好吧,这是因为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()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.