在Sprite工具包级别编辑器中创建的场景不起作用

时间:2015-03-21 10:00:36

标签: swift sprite-kit

我正试图这样做一段时间。我有一个名为PlayScene的游戏的主场景。那里有一个暂停按钮。当玩家点击该按钮时,我想加载另一个名为PauseScene的场景。对于visualy创建该场景我使用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() {

}

}

我试过this并且效果不佳。但是that tutorial最接近我的问题。它并没有破碎,也没有显示任何错误,但当我点击暂停按钮时,它正在转换到没有我背景的场景,只是标准的灰色场景。 This回答对我不起作用。第一个建议显示错误,当我尝试第二次并点击暂停时 - 游戏正在崩溃。   我不知道,该级别编辑器是为了更容易的工作而制作的,但是知道它只是为我加倍。我甚至认为问题出在我的背景图片中。但它的标准.png。为什么我的内容没有出现?  所以我试图复制GameViewController默认代码来加载GameScene并最终崩溃。这不是我第一次尝试取消归档时that error。这是什么意思?当我尝试用var scene = PauseScene(size: self.size)

替换if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene时,我得到了这个

1 个答案:

答案 0 :(得分:1)

由于拼写错误或文件甚至不在mainBundle中,它可能会转换为灰色场景。我测试了这个并且它有效。您需要确保在加载时写入.sks文件的确切名称,否则您将获得灰色屏幕。

实施例

如果文件被调用GameScreen.sks并且该类被称为GameScene,那么如果在加载.sks文件时放置类名,则会出现灰色屏幕。

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

因此,如果我们查看第二行代码,我们会看到它正在加载.sks文件,其名称GameScreen与类名GameScene相对。我们也使用文件扩展名中止,因为编译器默认知道它是我们在mainBundle中搜索的.sks文件。

如果你一直看到灰色屏幕,那么拼写或者你可能是一个错误GameViewController,在SKNode扩展中,一定要改变

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文件,而不会出现任何错误或崩溃。