我开始遵循 Ray Wenderlich 的“太空入侵者”教程,但分歧很大。我现在有 3 个 SKScene - 我的标题屏幕、我的主游戏屏幕和我的最终关卡/游戏结束屏幕。我添加了标题屏幕和游戏结束场景,它们都有 .sks 文件;主游戏屏幕没有,所有元素(SKSpriteNodes 等)都是以编程方式放置的。我的程序流程如下:
我现在实际上想通过场景编辑器放置主游戏屏幕的一些事件,因此我为其创建了一个 .sks 文件,并尝试按如下方式更改我的 titleScene.swift:
来自:
let gameScene = GameScene(size:CGSize(width: 1536, height: 2048))
至:
let gameScene = SKScene(fileNamed: "GameScene.sks") as! GameScene!
然而,这给出了:
我尝试删除必需的 init(coder aDecoder: NSCoder)
但 Xcode 提示
required init(coder: must be supplied by subclass of SKScene
但是我的 titleScene
和 gameOverScene
也是 SKScene 的子类,并且它们没有 init(coder:)
我真的看不出我正在通过 (fileNames:) 及其 .sks 文件显示我的 titleScreen 和 gameOverScene 的区别,并尝试对我的 gameScene 执行相同的操作。
最佳答案
您获得所需的原因是因为您有不可选的变量或在 init 发生之前未初始化的变量。
如果你有需要在 init 函数内部分配的变量,那么你会这样做:
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
但是你会问我:Knight0fDragon先生,它告诉我用coder
替换fileNamed
,当我切换它时它没有编译。
这是因为 init(fileNamed:)
是一个方便的 init,而不是指定的 init。为了能够子类化一个类并获得它所有的便利 inits,您需要重写它的所有指定 inits。
现在使用 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()
}
关于ios - 如何将 .sks 文件添加到现有 Swift/Sprite-Kit 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807702/