我正试图这样做一段时间。我有一个名为PlayScene
的游戏的主场景。那里有一个暂停按钮。当玩家点击该按钮时,我想加载另一个名为PauseScene的场景。对于visualy创建该场景我使用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)
}
}
这就是我在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
时,我得到了这个
答案 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
文件,而不会出现任何错误或崩溃。