在 Sprite 工具包级别编辑器中创建的场景不起作用
Posted
技术标签:
【中文标题】在 Sprite 工具包级别编辑器中创建的场景不起作用【英文标题】:Scene created in Sprite kit level editor is not working 【发布时间】:2015-03-21 10:00:36 【问题描述】:我正在尝试这样做一段时间。我有一个名为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()
我尝试了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 场景中创建带有重复图像的栏 - iOS
您可以通过在 chrome 开发工具(控制台)中创建的功能吗?