好的,我已经花了几个小时在这个问题上了,但是我还是很困惑。下面是 Background 类的代码:
class Background : SKNode {
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init() {
super.init()
buildBackground()
}
func buildBackground() {
var sprite : SKSpriteNode = SKSpriteNode(imageNamed: "background_full")
sprite.anchorPoint = CGPointZero
self.addChild(sprite)
}
}
我现在拥有的是指向其中png文件的以下地图文件。
background@2x~iphone.atlas --> background.png, background-567h.png, background-667h.png
background@3x~iphone.atlas --> background.png
background~ipad.atlas --> background.png
background@2x~ipad.atlas --> background.png
我得到了不可预测、不合理、随机的结果,其中图像在iOS 7上可能找不到iPhone4s,但在iOS 8上完全正常(但使用的是iPhone5的图像)。而iPhone 5将使用iPad @1x的纹理等。 我最初遵循此帖子的解决方案,但我不明白出了什么问题。 注意:@3x会给我一个错误,但我知道原因,文件太大无法包含在图集中,我计划在基础工作完成后分割背景。所以您可以忽略@3x,因为我没有将其包含在我的项目中,我只是想为您提供完整的画面。 编辑-请注意,我正在测试iOS 7.03、7.1和8.0。 我已经把我的调查缩小到...
background.atlas --> background.png (iPad 2)
background@2x.atlas --> background.png (iPhone 4s)
iPad 2显示正确结果,但其纹理却被用于iPhone 4s。
如果我的设置是这样的:
background@2x~iphone.atlas --> background.png (iPhone 4s)
background~ipad.atlas --> background.png (iPad 2)
iPhone 4s可以正确显示结果,但是它的纹理被用于iPad 2上,对于这两个设备,在iOS 8.0上都会出现错误,模拟器设备中显示应用程序路径,指出'SKTexture无法加载图像资源".../background@2x~iphone.atlasc/background@2x~iphone.1.png"'
针对以上两种情况,似乎默认使用的是图集中排在第一位的纹理。
如果我设置如下:
background.atlas --> background~ipad.png (iPad 2)
background@2x.atlas --> background@2x~iphone.png (iPhone 4s)
除了在iOS 7.03上出现错误信息“SKTexture couldn't load image resource "background.png"”之外,一切正常。与先前的示例不同,此处没有长路径。
另一个编辑
此页面底部的最后一个项目向我揭示了一个消息,即如果我将所有设备的背景PNG文件捆绑成一个图集,SpriteKit将会分开适当的设备,因此正确的纹理将被加载到内存中。但是,然后我必须区分所有iPhone型号(特别是声明为@2x的iphone 5和6)。如果我把它们都放在一起,是不是说会加载相应设备的PNG文件?
如果不是,我决定将PNG文件分成各自的设备图集,并编写一些代码来区分并加载正确的图集。