如何在 GameViewController.swift 中加载不同于 GameScene.swift 的 spritekit 文件?

How can I load a spritekit file different than GameScene.swift in my GameViewController.swift?

在GameViewController.swift中,我找到了这一行

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

而且我一直认为,如果我想加载 GameScene.swift 以外的内容,我只需将 "GameScene" 更改为 "LandingPage",一切都会正常进行。然而,正如我最近发现的那样,"GameScene" 这里实际上指的是 GameScene.sks 而不是 swift 文件。

我想制作一款包含多个关卡的游戏,每个关卡都写在自己的 swift 文件中。我要去哪里/如何从 level1.swift 移动到 level2.swift?

您可以在 Custom Class Inspector 中为每个场景文件指定自定义 class 名称。这是“实用程序”窗格中最右边的选项卡。

载入sks文件时载入自定义class(必须是SKScene的子class)。

如果你在一个场景中,比如关卡选择场景,比方说LevelSelectionScene.swift,你可以通过SKView-presentScene:transition:方法进入另一个场景。

class LevelSelectionScene: SKScene {

    override func didMoveToView(view: SKView) { /* ... */}

    func selectLevel(level: Int) {
        let fadeTransition = SKTransition.fadeWithDuration(0.3)
        if let selectedLevel = createLevelSceneWithLevel(level) {
            self.view?.presentScene(selectedLevel, transition: fadeTransition) 
        }
    }


    // Not a good idea if you progressively adding new levels,
    // it's totally depend on how you gonna organize your levels.
    // Since its level input is not arbitrary, the output of this
    // rarely nil, if it does, it must be the developer mistake.
    func createLevelSceneWithLevel(level: Int) -> SKScene? {
        let levelScene: SKScene?
        switch level {
            case 1: levelScene = Level1()
            case 2: levelScene = Level2()
            default: levelScene = nil
        }
        return levelScene
    }

}

正如上面有人所说的那样 "fileNamed: "GameScene" "

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

引用 GameScene.sks 文件,相当于游戏的故事板。

如果您创建一个新的 SKScene class 并尝试以这种方式加载它,无论是从另一个 SKScene 还是 gameViewController 它将无法工作,因为它找不到相应的 sks 文件。

我不是 100% 确定如何创建新的 sks 文件,因为我没有在我的游戏中使用它。

如果您只想加载您创建的新场景,您可以在 gameViewController 中使用此代码

let skView = self.view as! SKView
let scene = NewScene(size: skView.bounds.size)

skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)

如果你想从 SKScene 加载另一个场景 class 它基本上是相同的代码

let newScene = NewScene(size: self.size) //size of current scene
let  transition = SKTransition.doorsCloseHorizontalWithDuration(0.5) // use transition between 2 SKScenes
let skView = self.view as! SKView            
skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
newScene.scaleMode = .AspectFill
skView.presentScene(newScene, transition: transition)

或更简洁的版本

let newScene = NewScene(size: self.size)
let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5)
newScene.scaleMode = SKSceneScaleMode.AspectFill
self.view?.presentScene(newScene, transition: transition)