在 Sprite 套件关卡编辑器中创建的场景无法正常工作
Scene created in Sprite kit level editor is not working
我正在尝试这样做一段时间。我有一个名为 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)
}
}
这就是我在 PauseScene.swift
中的内容:
class PauseScene: SKScene {
override func didMoveToView(view: SKView) {
self.initPauseScene()
}
func initPauseScene() {
}
}
我试过 and it's not working very well. However that tutorial is closest I could get with my problem. It's not crushing and isn't showing any errors, but when I tap pause button it's transitioning to that scene without my background, just standard grey scene. 答案对我不起作用。第一个建议显示错误,当我第二次尝试并点击暂停时 - 游戏正在崩溃。
我不知道,那个关卡编辑器是为了更轻松的工作而设计的,但我知道它对我来说只是加倍了。我什至认为问题可能出在我的背景图片中。但它的标准.png。为什么我的内容没有显示?
因此,我尝试复制 GameViewController 默认代码以加载 GameScene,但以崩溃告终。这不是我第一次尝试取消存档时 that error。这是什么意思?当我试图用 if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene
替换 var scene = PauseScene(size: self.size)
时,我得到了这个
可能由于拼写错误或文件甚至不在 mainBundle 中而过渡到灰色场景。我已经测试过这个并且它有效。您需要确保在加载时输入的是 .sks 文件的确切名称,否则会出现灰屏。
例子
如果文件名为 GameScreen.sks
而 class 名为 GameScene
那么如果您在加载 .sks 文件时输入 class 名称,您将得到一个灰屏。
let doors = SKTransition.doorwayWithDuration(1.0)
let archeryScene = GameScene(fileNamed: "GameScreen")
self.view?.presentScene(archeryScene, transition: doors)
因此,如果我们查看第二行代码,我们会看到它正在加载名称为 GameScreen
的 .sks 文件,而不是 class 名称 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
文件而不会出现任何错误或崩溃。
我正在尝试这样做一段时间。我有一个名为 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)
}
}
这就是我在 PauseScene.swift
中的内容:
class PauseScene: SKScene {
override func didMoveToView(view: SKView) {
self.initPauseScene()
}
func initPauseScene() {
}
}
我试过 if let scene = PauseScene.unarchiveFromFile("PauseScene") as? PauseScene
var scene = PauseScene(size: self.size)
时,我得到了这个
可能由于拼写错误或文件甚至不在 mainBundle 中而过渡到灰色场景。我已经测试过这个并且它有效。您需要确保在加载时输入的是 .sks 文件的确切名称,否则会出现灰屏。
例子
如果文件名为 GameScreen.sks
而 class 名为 GameScene
那么如果您在加载 .sks 文件时输入 class 名称,您将得到一个灰屏。
let doors = SKTransition.doorwayWithDuration(1.0)
let archeryScene = GameScene(fileNamed: "GameScreen")
self.view?.presentScene(archeryScene, transition: doors)
因此,如果我们查看第二行代码,我们会看到它正在加载名称为 GameScreen
的 .sks 文件,而不是 class 名称 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
文件而不会出现任何错误或崩溃。