不知道为什么这从未完成,但这是一个实际上是正确的解决方法的开始,但不幸的是慢了一点。也许有人可以看到一些东西以使其处理得更快
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;
}
}