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

How to add an .sks files to existing Swift/Sprite-Kit project?

我开始遵循 Ray Wenderlich 的 'Space Invaders' 教程,但有很大的不同。我现在有 3 个 SKScenes - 我的标题屏幕、我的主游戏屏幕和我的结束 level/game 屏幕。我添加的标题屏幕和结束游戏场景,它们都有 .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 然后抱怨

required init(coder: must be supplied by subclass of SKScene

但是我的 titleScenegameOverScene 也是 SKScene 的 sub-classes 并且他们没有 init(coder:)

我真的看不出我通过 (fileNames:) 和他们的 .sks 文件显示我的 titleScreen 和我的 gameOverScene 以及尝试对我的 gameScene 做同样的事情有什么不同。

您获得所需的原因是因为您的变量不是可选的或在 init 发生之前未初始化。

如果您有需要在 init 函数内部分配的变量,那么您可以这样做:

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

但是你会问我:Knight0fDragon先生,它让我把fileNamed替换成coder,我切换的时候编译不通过

这是因为 init(fileNamed:) 是一个方便的 init,而不是指定的 init。为了能够 subclass a class 并获得它的所有便利初始化,您需要覆盖所有指定的初始化。

现在有了 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()
}