Xcode SpriteKit unarchiveFromFile不会从资源目录和地图集加载纹理
我还是SpriteKit新手,想看看是否可以使用Xcode的SKS编辑器构建一个级别。当我添加了两个带有“Spaceship.png”纹理的精灵并构建了模板应用程序时,这些纹理不会加载 下面是使用Swift作为语言的香草OSX游戏模板的屏幕截图,并添加了提供的“Spaceship.png”精灵。纹理显示精细: 以下是仅对模板进行修改即可构建和运行应用程序的结果: 调试控制台显示以下警告消息: 我尝试添加一个.atlas文件夹,得到了相同的结果。场景只显示红色的X图标来代替精灵。如果添加的精灵中只有彩色精灵,则它们显示良好。不久前我有一个应用程序被我废弃了,我用它来加载SKScene并将其中的精灵资源手动添加到我的SKScene子类中,它工作得很好 但是,如果我将纹理(“Spaceship.png”作为示例)移动到项目的根目录中,即不在资源目录或.atlas文件夹中,则场景加载时纹理显示良好 以下是添加到项目根目录的纹理: 这是期望的结果: 我试图通过Xcode SpriteKit unarchiveFromFile不会从资源目录和地图集加载纹理,xcode,macos,swift,sprite-kit,Xcode,Macos,Swift,Sprite Kit,我还是SpriteKit新手,想看看是否可以使用Xcode的SKS编辑器构建一个级别。当我添加了两个带有“Spaceship.png”纹理的精灵并构建了模板应用程序时,这些纹理不会加载 下面是使用Swift作为语言的香草OSX游戏模板的屏幕截图,并添加了提供的“Spaceship.png”精灵。纹理显示精细: 以下是仅对模板进行修改即可构建和运行应用程序的结果: 调试控制台显示以下警告消息: 我尝试添加一个.atlas文件夹,得到了相同的结果。场景只显示红色的X图标来代替精灵。如果添加的精灵中
enumerateChildNodesWithName(uu,usingBlock)
将加载的资源从SKS文件手动添加到场景中,如果纹理不在项目文件夹的根目录中,我会得到相同的结果
这是我试图手动添加资产的原因:
func applicationDidFinishLaunching(aNotification: NSNotification) {
/* Pick a size for the scene */
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
let sceneToBePresented = GameScene()
/* Set the scale mode to scale to fit the window */
sceneToBePresented.scaleMode = .AspectFill
sceneToBePresented.size = scene.size
/* Sprite Kit applies additional optimizations to improve rendering performance */
self.skView!.ignoresSiblingOrder = true
self.skView!.showsFPS = true
self.skView!.showsNodeCount = true
scene.enumerateChildNodesWithName("*") { node, stop in
sceneToBePresented.addChild(node.copy() as SKSpriteNode)
}
self.skView!.presentScene(sceneToBePresented)
}
}
我环顾了SpriteKit类——SKNode
、SKScene
、SKTexture
、SKSPriteNode
——寻找有关路径、缓存、预加载或其他方面的任何线索,但找不到可以实现这一点的方法
我运行的是Xcode 6.1.1,目标是10.9,我使用的语言是Swift,尽管使用ObjC时同样的行为也适用。这是一个特性还是一个bug?还有谁遇到过类似的情况吗
提前谢谢你的帮助
[更新]
看起来这还没有实现-从资产目录加载纹理-因为dev论坛中的这篇文章讨论了相同的问题,他的解决方案是将资产目录重命名为与纹理相同的名称。从本质上说,我发现在根文件夹中有图像文件:,虽然我以前的应用程序(我设法回滚到工作状态)确实从.atlas加载纹理,但我似乎无法使用干净的模板 [在这里回答我自己的问题] 据我所知,目前,从资产目录加载纹理-
Images.xcsets
,同时取消归档或反序列化SKScene
文件,基于我的尝试和上面提到的devforumns post,在OSX上不起作用
但是,从图像地图集加载纹理是通过强制SKTexture
加载图像来实现的。可以通过Preload withCompletionHandler(:)
或Preload Textures(:,withCompletionHandler:)
方法强制或“触摸”SKTexture,或者像我发现的那样,只需打印精灵的SKTexture
描述即可
为方便可能需要进一步帮助的任何人,以下是一个代码片段,用于在取消归档SKS文件后预加载纹理:
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
for child in scene.children as [SKNode] {
if child is SKSpriteNode {
let sprite = child as SKSpriteNode
sprite.texture?.preloadWithCompletionHandler({ })
/* or even a simple debug log of the texture */
/* println(sprite.texture) */
}
}
/* Do your other stuff ... */
...
}
如果我错了,请纠正我。除非有人这样做,或者苹果修复了SpriteKit在iOS和OSX之间的行为差异,否则我不会寻找另一种解决方案,并将遵循Murphey定律:
如果它有效,就不要修复它
遵循Salam Horani的解决方案,对于Swift 2.x,您还没有“unarchiveFromFile”,因此您可以创建如下场景:
if let gameScene = GameScene(fileNamed: "GameScene") {
// ...
}
你有没有试着做一个干净的然后建造?我对场景编辑器有很多问题。我真的很想把它用于我的游戏开发,但它的功能太多了,而且不完整。我做到了。我甚至从头开始创建了一个新的干净模板,如上图所示。我所做的唯一修改就是在
gamesence.sks
文件中添加了一个带纹理的精灵。不过,有一点很奇怪,相同模板的iOS版本运行良好,没有任何警告。所以,我开始认为这可能是OSX的目标问题。尽管如此,它在低至iOS 7.0的环境下仍能正常工作。另外,它以前在我搞砸的一个应用程序中也能工作,因为我从一个SKS文件加载sprite资源,并将它们手动添加到我的场景中,没有任何问题。