Sprite Kit关卡编辑器创建的场景无法运行。

3

我已经尝试了一段时间。我有一个名为PlayScene的游戏主场景,其中有一个暂停按钮。当玩家点击该按钮时,我想要加载另一个场景,名为PauseScene。为了视觉上创建该场景,我使用Sprite kit级别编辑器。因此,我有两个文件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() {

}

我尝试了这个,但它效果不佳。然而,那个教程是我能找到的最接近我的问题的教程。它没有崩溃也没有显示任何错误,但当我点击暂停按钮时,它会转换到该场景,但没有背景,只有标准的灰色场景。这个答案对我不起作用。第一个建议会出现错误,当我尝试第二个建议并点击暂停时,游戏会崩溃。 我不知道,这个关卡编辑器是为了更轻松的工作而制作的,但现在它只是让我的工作量增加了一倍。我甚至以为问题在我的背景图像上。但它是标准的.png格式。为什么我的内容没有显示出来? 因此,我尝试复制GameViewController默认代码以加载GameScene,结果导致崩溃。这不是我第一次在尝试解档时遇到这个错误。这是什么意思?当我尝试用if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene替换var scene = PauseScene(size: self.size)时,我得到了这个错误。

1个回答

1
可能是由于拼写错误或文件不在mainBundle中而导致场景变为灰色。我已经测试过这个方法,它有效。在加载时,您需要确保写入.sks文件的确切名称,否则会出现灰色屏幕。
示例
如果文件名为GameScreen.sks,类名为GameScene,则如果在加载.sks文件时输入类名,将会得到灰色屏幕。
let doors = SKTransition.doorwayWithDuration(1.0)
let archeryScene = GameScene(fileNamed: "GameScreen")
self.view?.presentScene(archeryScene, transition: doors)

所以,如果我们看第二行代码,我们可以看到它正在加载名为GameScreen的.sks文件,而不是类名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文件而不会出现任何错误或崩溃。


非常感谢您的时间和帮助!不幸的是,我很生气,删除了我的.sks文件,并通过编程设置了一切,所以现在无法尝试:D 但是我肯定会在今天为我的下一个场景做这件事,并回复它的工作情况! - Burundanga
我认为我的代码被诅咒了,因为它无法正常运行。我知道问题出在我自己身上,但我不知道该从哪里入手解决。还有一件事——假设我已经在“.sks”文件中完成了所有节点的定位,并保存了项目并锁定了节点选择。那么我是否已经准备好了?或者我需要做些什么来应用我所做的更改? - Burundanga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接