如何将 .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
但是我的 titleScene
和 gameOverScene
也是 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()
}
我开始遵循 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
但是我的 titleScene
和 gameOverScene
也是 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()
}