为SKScene创建一个自定义的initalizer,它会覆盖便利init?(fileNamed :)

dro*_*Fai 5 initialization sprite-kit swift swift3 xcode8

我正在尝试创建一个方便初始化程序来覆盖convenience init? (fileNamed:)SKScene中的初始化程序,以便我可以将一些初始值传递给场景,同时还取消归档.sks文件.问题是,当我尝试这样做时,似乎SKScene(GameScene)的子类无法看到convenience init? (fileNamed:)超类的子类.以下是我的一些尝试:

Class GameScene : SKScene {

var stage : Int?

override init(size: CGSize) {
    super.init(size: size)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

convenience init?(fileNamed: String, stage: Int) {
    self.init(fileNamed: fileNamed)  // Compiler error-- Argument labels '(filenamed:)' do not match any available overloads
    self.stage = stage
}
Run Code Online (Sandbox Code Playgroud)

我发现的另一个尝试建议作为解决方法:

Class GameScene : SKScene {

var stage : Int?

override init(size: CGSize) {
    super.init(size: size)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

convenience init?(fileNamed: String) {
    self.init(fileNamed: fileNamed) // Error at run time: EXC_BAD_ACCESS (code=2, address=0x16fc1bff0) 
}

convenience init?(fileNamed: String, stage: Int) {
    self.init(fileNamed: fileNamed)  
    self.stage = stage
}
Run Code Online (Sandbox Code Playgroud)

调试器显示无限循环 GameScene.init(fileNamed : String) -> GameScene?

我该如何做到这一点?我需要继续我的生活!(和这个项目......)

Ron*_*huk 3

难道就不能这么简单吗?

if let gameScene = GameScene(fileNamed: "GameScene") {

        self.gameScene = gameScene
        self.gameScene.stage = 1
        self.gameScene.setupBasedOnStage()
        self.gameScene.scaleMode = .aspectFill
        self.gameScene.gameSceneDelegate = self.menuSceneDelegate as! GameSceneDelegate!
        self.view?.presentScene(self.gameScene, transition: SKTransition.reveal(with: .down, duration: 1.0))
    }
Run Code Online (Sandbox Code Playgroud)

您可以在显示页面之前设置舞台属性,如果需要,您可以调用设置函数来加载基于舞台的信息/图形。

我知道它不像你想做的那么优雅,但也许有时最简单的答案就是最好的?