代码之家  ›  专栏  ›  技术社区  ›  Burundanga

在精灵工具包级别编辑器中创建的场景不工作

  •  3
  • Burundanga  · 技术社区  · 10 年前

    我试着这样做一段时间。我有一个游戏的主要场景 PlayScene 。我有一个暂停按钮。当玩家点击该按钮时,我想加载另一个名为PauseScene的场景。为了可视化地创建场景,我使用Sprite工具包级别编辑器。所以我有两个文件 PauseScene.swift PauseScene.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)
            }
        }    
    

    这就是我所拥有的 暂停场景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 回复  |  直到 8 年前
        1
  •  1
  •   Community CDub    4 年前

    由于拼写错误或文件不在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 与类名相对 游戏场景 。我们还中止使用文件扩展名,因为编译器默认知道它是我们在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 文件没有任何错误或崩溃。