Spritekit – 不从SKTextureAtlas加载@ 3x图片

由于我的示例项目被删除(我认为这将是更容易testing),我会张贴一些代码和图像来说明我的观点。

这里是示例图像

2倍图像

我的3倍图像

我的地图集设置:

在这里输入图像说明

我的启动图像设置:

在这里输入图像说明

代码中我添加这些精灵到我的场景

override func didMoveToView(view: SKView) { let texture = SKTextureAtlas(named: "scenery") let test = SKSpriteNode(texture: texture.textureNamed("test")) test.position = CGPoint(x: self.size.width/2, y: self.size.height/2) self.addChild(test) } 

这些是我的结果:

iPhone 5模拟器:

在这里输入图像说明

iPhone 6 plus模拟器:

在这里输入图像说明

我尝试更改启动图像以使用资产目录。 然后iPhone 6加上似乎高档2倍的屏幕。 它仍在加载2倍的图像,但将其扩展。

我需要它来加载我的3倍图像,并与我的2倍图像成比例。

Gabuh的回答下面指出了正确的方向。 在一个新项目上工作。 但是,如果我使用他的解决scheme来处理我的真实SpriteKit项目,我的3x图像不会缩小。 他们比他们应该大3倍。

这似乎是一个错误,当Xcode生成编译的地图集。 如果您在编译的应用程序的包内部检查,您将看到Xcode没有为@ 3x图像创build正确的地图集名称。

我已经通过使用@ 3x名称创build地图集来获取@ 3x资源,并且保留没有后缀的图像。

您可以检查UIScreen.mainscreen().scale来决定要使用的地图集名称。 检查附图中的图集名称,以及getTextureAtlas的代码 在这里输入图像说明

如果你正在使用一种新的方式来创build地图集,它似乎正在工作。 重要的是, Deployment target应该是> = 9.0 …

selectAssets.xcassets并点击+标记以创build一个新的精灵图集:

在这里输入图像说明

select“新雪碧图集”选项,并添加@ 2x和@ 3x资产:

在这里输入图像说明

然后在代码中这样做:

 let sprite = SKSpriteNode(texture: SKTextureAtlas(named: "Sprites").textureNamed("test")) sprite.position = CGPoint(x: frame.midX, y: frame.midY) addChild(sprite) 

暗示:

如果您在模拟器上进行testing,请在尝试此操作之前重置模拟器的内容和设置以清除caching。

现在Xcode 6.2从一个地图集中加载@ 3x和@ 2x图像。 它加载一个1倍的大小(似乎自己调整图像的大小),如果你不把@ 2x / @ 3x在图像名称的末尾。

不知道为什么这从来没有完成,但这是一个解决scheme的开始,实际上是正确的,但不幸的是有点慢。 也许有人可以看到一些事情,使其处理速度更快

 import Foundation import SpriteKit public class Atlas: SKTextureAtlas { var textures = [String:(texture:SKTexture,image:UIImage)](); public convenience init(named name: String) { self.init() let scale = CGFloat(UIScreen().scale); let path = "\(name).atlasc/\(name)"; let atlasContent = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource(path, ofType: "plist")!); let content = atlasContent!["images"] as! [[String:AnyObject]]; let info = content[Int(scale) - 1] ; let imagepath = "\(name).atlasc/\((info["path"] as! String!).stringByReplacingOccurrencesOfString(".png", withString: ""))"; let imgDataProvider = CGDataProviderCreateWithCFData(NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(imagepath, ofType: "png")!)); let cgimage = CGImageCreateWithPNGDataProvider(imgDataProvider, nil, true, .RenderingIntentDefault); let subimages = info["subimages"] as! [[String:AnyObject]]; for subimage in subimages { let spriteSourceSize = CGSizeFromString(subimage["spriteSourceSize"] as! String); let size = CGSizeApplyAffineTransform(spriteSourceSize, CGAffineTransformMakeScale(1/scale,1/scale)); let isFullyOpaque = subimage["isFullyOpaque"] as! Bool; let spriteOffset = CGPointFromString((subimage["spriteOffset"] as! String)); let textureRect = CGRectFromString((subimage["textureRect"] as! String)); let textureRectSize = CGSizeApplyAffineTransform(textureRect.size, CGAffineTransformMakeScale(1/scale,1/scale)); let name = (subimage["name"] as! String).stringByReplacingOccurrencesOfString("@3x.png", withString: ""); let textureRotated = subimage["textureRotated"] as! Bool; let smallImage = CGImageCreateWithImageInRect(cgimage, textureRect); UIGraphicsBeginImageContextWithOptions(size, isFullyOpaque, scale); let context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextSetShouldAntialias(context,false); CGContextSetAllowsAntialiasing( context ,false); CGContextSetInterpolationQuality(context , CGInterpolationQuality.None) if(textureRotated) { CGContextTranslateCTM(context, (size.width)/2, (size.height)/2); CGContextScaleCTM(context, 1, -1); CGContextRotateCTM(context,CGFloat(M_PI_2)); CGContextTranslateCTM(context, 0, ((size.height - textureRectSize.height))); CGContextTranslateCTM(context, -((size.height)/2), -((size.width)/2)); CGContextTranslateCTM(context, spriteOffset.y/scale, -spriteOffset.x/scale); } else { //Set to center of image to flip correctly CGContextTranslateCTM(context, (size.width)/2, (size.height)/2); CGContextScaleCTM(context, 1, -1); CGContextTranslateCTM(context, -((size.width)/2), -((size.height)/2)); CGContextTranslateCTM(context, spriteOffset.x/scale, spriteOffset.y/scale); } CGContextDrawImage(context,CGRect(origin: CGPoint.zero,size: textureRectSize), smallImage); let image = UIGraphicsGetImageFromCurrentImageContext(); let texture = SKTexture(image: image); textures[name] = (texture:texture,image:image); CGContextRestoreGState(context); UIGraphicsEndImageContext(); } } override public func textureNamed(name: String) -> SKTexture { return textures[name]!.texture; } public func imageNamed(name: String) -> UIImage { return textures[name]!.image; } } 

这个bug仍然没有解决。 通过使用@ 2x图像,应用程序的视觉被破坏。 而是通过查看屏幕比例来select正确的图像。

 textureName = [UIScreen mainScreen].scale > 2.9 ? @"awesome@3x" : @"awesome";