Spritekit - not loading @3x images from SKTextureAtlas

后端 未结 5 556
忘掉有多难
忘掉有多难 2020-11-30 07:51

Since my sample project was deleted (I thought this would be much easier to test), I will post some code and images to illustrate my point.

Here are sample images

5条回答
  •  难免孤独
    2020-11-30 08:37

    Not sure why this was never done, but here is the start of a workaround that is actually correct, but is a little slower unfortunately. Maybe someone can see some things to make it process faster

    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;
        }
    }
    

提交回复
热议问题