我正在尝试扩展我的 SKScene Swift类,使用加载的地图集中的纹理创建 SpriteKit节点并同时设置节点的名称,以节省我的时间我需要为每个其他节点使用的行,并且我将它用作扩展,因为我不想在我创建的每个类中编写相同的方法。另外,我必须将方法创建为类方法,否则我会在init处获得相同的错误。
这是我的扩展程序代码:
import SpriteKit
internal extension SKScene {
func nodeWithTexture(atlas: SKTextureAtlas, texture: String, name: String) -> SKSpriteNode {
let nodeTexture = atlas.textureNamed(texture)
let node = SKSpriteNode(texture: nodeTexture)
node.name = name
return node
}
}
现在,我的问题是我无法在我的场景的启动器中使用该方法。它给了我一个我不理解的super.init错误。
这是我在super.init(size: size)
调用之前尝试在init中使用扩展程序时遇到的错误。
这是我在super.init(size)调用后尝试使用时出现的错误。
由于Nate的回答,我使用下一种方法解决了我的问题。
首先,我在声明时刻初始化所有存储的属性:
let background = SKSpriteNode()
然后我在super.init(size: size)
调用后调用扩展方法,并设置了所有内容:
super.init(size: size)
background = nodeWithTexture(atlas, texture: "bg", name: "background")
答案 0 :(得分:4)
初始化程序需要在调用super.init()
之前为所有存储的属性提供初始值,并且必须先调用super.init()
才能调用任何其他实例方法。
您可以通过以下两种方式解决此问题:
将background
声明为隐式解包的可选项 - nil
是可选项的可接受初始值,因此您可以在nodeWithTexture()
后调用super.init()
var background: SKSpriteNode!
将背景声明为懒惰属性 - 如果它始终基于atlas
,您可以这样声明:
lazy var background: SKSpriteNode = self.nodeWithTexture(self.atlas, texture: "bg", name: "background")