我还是SpriteKit的新手,想看看我是否可以使用Xcode的SKS编辑器构建关卡。当我添加几个精灵与" Spaceship.png"纹理和构建模板应用程序,纹理不会加载。
这里是使用Swift作为语言的vanilla OSX游戏模板的屏幕截图,并添加了一个提供的" Spaceship.png"精灵。纹理显示很好: 以下是构建和运行应用程序的结果,只对模板进行了修改:
调试控制台显示以下警告消息: 我试图添加.atlas文件夹,并得到相同的结果。场景只显示红色X图标代替精灵。如果添加的精灵只是颜色精灵,它们显示正常。前段时间我有一个应用程序,我已经废弃了,我曾经加载过SKScene并手动将精灵资产添加到我的SKScene子类中,它运行良好。
然而,如果我移动纹理 - " Spaceship.png"例如 - 对于项目的根,即不在资产目录或.atlas文件夹中,场景加载时纹理显示正常。
这是添加到项目根目录的纹理:
这是理想的结果:
我试图通过enumerateChildNodesWithName(_,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?还有其他人跑/遇到类似情况吗?
提前感谢您提供任何帮助
[UPDATE]
看起来这还没有实现 - 从资产目录中加载纹理 - 因为开发论坛中的这篇文章讨论了同样的问题,他的解决方案是将资产目录重命名为与纹理相同的名称。本质上,我发现将图像文件放在根文件夹中How do you load sprite textures from Images.xcassets when using SKS scene file,虽然我设法回滚到工作状态的早期应用程序确实从.atlas' es加载纹理,但是我似乎无法用干净的模板做到这一点!!!
答案 0 :(得分:4)
[在这里回答我自己的问题]
据我所知,此时,从资产目录中加载纹理 - Images.xcassets
- 同时取消归档或反序列化SKScene
文件根据我的尝试和devforumns帖子在OSX上不起作用以上引用。
然而,通过强制SKTexture
加载图像,从图像地图集加载纹理起作用。强制或“触摸”SKTexture
可以通过preloadWithCompletionHandler(_:)
或preloadTextures(_:, withCompletionHandler:)
方法完成,或者只是打印我发现的精灵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 ... */
...
}
如果我错了请纠正我。直到有人,或者Apple修复了SpriteKit在iOS和OSX之间的行为之间的差异,我不会寻找另一种解决方案,并且会遵循Murphey定律:
如果有效,请不要修理
答案 1 :(得分:1)
关注Salam Horani解决方案,对于Swift 2.x,你还没有" unarchiveFromFile"所以你可以创建这样的场景:
if let gameScene = GameScene(fileNamed: "GameScene") {
// ...
}