How Do I Blur a Scene in SpriteKit?

后端 未结 7 910
北恋
北恋 2020-11-28 06:00

How would I add a gaussian blur to all nodes (there\'s no fixed number of nodes) in an SKScene in SpriteKit? A label will be added on top of the scene later, this will be m

7条回答
  •  渐次进展
    2020-11-28 06:25

    Swift 3 Update: This is @Chuck Gaffney's answer updated for Swift 3. I know this question is tagged objective-c, but this page ranked 2nd in Google for "swift spritekit blur". I changed currentScene to self.

        func getBluredScreenshot() -> SKSpriteNode{
    
        //create the graphics context
        UIGraphicsBeginImageContextWithOptions(CGSize(width: self.view!.frame.size.width, height: self.view!.frame.size.height), true, 1)
    
        self.view!.drawHierarchy(in: self.view!.frame, afterScreenUpdates: true)
    
        // retrieve graphics context
        _ = UIGraphicsGetCurrentContext()
    
        // query image from it
        let image = UIGraphicsGetImageFromCurrentImageContext()
    
        // create Core Image context
        let ciContext = CIContext(options: nil)
        // create a CIImage, think of a CIImage as image data for processing, nothing is displayed or can be displayed at this point
        let coreImage = CIImage(image: image!)
        // pick the filter we want
        let filter = CIFilter(name: "CIGaussianBlur")
        // pass our image as input
        filter?.setValue(coreImage, forKey: kCIInputImageKey)
    
        //edit the amount of blur
        filter?.setValue(3, forKey: kCIInputRadiusKey)
    
        //retrieve the processed image
        let filteredImageData = filter?.value(forKey: kCIOutputImageKey) as! CIImage
        // return a Quartz image from the Core Image context
        let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent)
        // final UIImage
        let filteredImage = UIImage(cgImage: filteredImageRef!)
    
        // create a texture, pass the UIImage
        let texture = SKTexture(image: filteredImage)
        // wrap it inside a sprite node
        let sprite = SKSpriteNode(texture:texture)
    
        // make image the position in the center
        sprite.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
    
        let scale:CGFloat = UIScreen.main.scale
    
        sprite.size.width  *= scale
    
        sprite.size.height *= scale
    
        return sprite
    
    
    }
    
    func loadPauseBGScreen(){
    
        let duration = 1.0
    
        let pauseBG:SKSpriteNode = self.getBluredScreenshot()
    
        pauseBG.alpha = 0
        pauseBG.zPosition = self.zPosition + 1
        pauseBG.run(SKAction.fadeAlpha(to: 1, duration: duration))
    
        self.addChild(pauseBG)
    
    }
    

提交回复
热议问题