在 Sprite 套件关卡编辑器中创建的场景无法正常工作

Scene created in Sprite kit level editor is not working

我正在尝试这样做一段时间。我有一个名为 PlayScene 的游戏的主要场景。我那里有一个暂停按钮。当玩家点击该按钮时,我想加载另一个名为 PauseScene 的场景。为了直观地创建该场景,我使用 Sprite 工具包关卡编辑器。所以我有两个文件 PauseScene.swiftPauseScene.sks。但是 .sks 内容(目前只是背景)并没有取消存档。我真的不知道我在哪里会犯错误。 所以这是我通过位于 PlayScene

的暂停按钮进行的​​转换
for touch: AnyObject in touches {
    let location = touch.locationInNode(self)
        if self.nodeAtPoint(location) == self.pause {
            var scene = PauseScene(size: self.size)
            scene.paused = true
            let skView = self.view as SKView!
            skView.ignoresSiblingOrder = true
            scene.scaleMode = .AspectFill
            scene.size = skView.bounds.size
            skView.presentScene(scene)
        }
    }    

这就是我在 PauseScene.swift 中的内容:

class PauseScene: SKScene {
override func didMoveToView(view: SKView) {
    self.initPauseScene()
}
func initPauseScene() {

}

}

我试过 and it's not working very well. However that tutorial is closest I could get with my problem. It's not crushing and isn't showing any errors, but when I tap pause button it's transitioning to that scene without my background, just standard grey scene. 答案对我不起作用。第一个建议显示错误,当我第二次尝试并点击暂停时 - 游戏正在崩溃。 我不知道,那个关卡编辑器是为了更轻松的工作而设计的,但我知道它对我来说只是加倍了。我什至认为问题可能出在我的背景图片中。但它的标准.png。为什么我的内容没有显示? 因此,我尝试复制 GameViewController 默认代码以加载 GameScene,但以崩溃告终。这不是我第一次尝试取消存档时 that error。这是什么意思?当我试图用 if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene

替换 var scene = PauseScene(size: self.size) 时,我得到了这个

可能由于拼写错误或文件甚至不在 mainBundle 中而过渡到灰色场景。我已经测试过这个并且它有效。您需要确保在加载时输入的是 .sks 文件的确切名称,否则会出现灰屏。

例子

如果文件名为 GameScreen.sks 而 class 名为 GameScene 那么如果您在加载 .sks 文件时输入 class 名称,您将得到一个灰屏。

let doors = SKTransition.doorwayWithDuration(1.0)
let archeryScene = GameScene(fileNamed: "GameScreen")
self.view?.presentScene(archeryScene, transition: doors)

因此,如果我们查看第二行代码,我们会看到它正在加载名称为 GameScreen 的 .sks 文件,而不是 class 名称 GameScene。我们还中止使用文件扩展名,因为默认情况下编译器知道它是我们在 mainBundle 中搜索的 .sks 文件。

如果你老是灰屏,那可能是拼写错误,或者是你的GameViewController,在SKNode Extension中,一定要改

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {
      if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
        
        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}
}

到这个..

 extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {
      if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
        
        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKScene
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
   }
}

我们刚刚编辑了这行代码,

 let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene

至此

 let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKScene

这将使我们能够加载多个 .sks 文件而不会出现任何错误或崩溃。