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

Posted

技术标签:

【中文标题】在 Sprite 工具包级别编辑器中创建的场景不起作用【英文标题】:Scene created in Sprite kit level editor is not working 【发布时间】:2015-03-21 10:00:36 【问题描述】:

我正在尝试这样做一段时间。我有一个名为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() 


我尝试了this,但效果不佳。但是that tutorial 是我能解决的最接近的问题。它没有崩溃,也没有显示任何错误,但是当我点击暂停按钮时,它会过渡到没有我背景的场景,只是标准的灰色场景。 This 答案对我不起作用。第一个建议显示错误,当我尝试第二个并点击暂停时 - 游戏崩溃了。 我不知道,那个关卡编辑器是为了更轻松的工作而设计的,但要知道它对我来说只是加倍。我什至认为问题可能出在我的背景图像中。但它的标准.png。为什么我的内容没有显示? 所以我试图复制 GameViewController 默认代码来加载 GameScene 并最终崩溃。这不是我第一次尝试取消归档时遇到that error。这是什么意思?当我尝试用 if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene 替换 var scene = PauseScene(size: self.size) 时,我得到了这个

【问题讨论】:

【参考方案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 但我今天肯定会为我的下一个场景执行此操作,并会回应它是如何工作的! 我认为我被诅咒了,因为它不起作用。我知道这是我的某个地方的错误。我只是不知道在哪里看。还有一件事——假设我将所有内容都放在.sks 文件中,保存项目,锁定节点选择。我准备好出发了吗?也许我需要做更多的事情来应用我所做的更改?

以上是关于在 Sprite 工具包级别编辑器中创建的场景不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Sprite kit场景编辑器中节点相对位置的解决方案?

在 Sprite Kit 场景中创建带有重复图像的栏 - iOS

Sprite Kit 暂停/恢复场景在重启后不起作用

您可以通过在 chrome 开发工具(控制台)中创建的功能吗?

如何在 Sprite 工具包中创建方形 SKLabelNode

在 Google adsense 中创建的新单元不起作用