繁体   English   中英

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

[英]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的子类提供

但是我的titleScenegameOverScene也是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM