Blur SKShapeNode with SKEffectNode

I am trying to blur SKShapenode in my program. However, I want the shapenode to blur gradually, lasting about 1 second. How do I achieve this? The current code blurs it instantly.

func generateAnimation() {

var blurAction : SKAction = SKAction.runBlock{
   //the method below returns a shapeNode
    var circle = self.generateImage()
    var effect : SKEffectNode = SKEffectNode()
    var filter : CIFilter = CIFilter(name:"CIGaussianBlur")
    filter.setValue(10, forKey: "inputRadius")
    effect.filter = filter
    effect.addChild(circle)
    self.addChild(effect)           
}
+4
source share
3 answers

Implement a method updatein a subclass SKScene(or delegate). Then, for one second, repeat this line each time you call the method update:

filter.setValue(10, forKey: "inputRadius")

Instead of passing a value 10, interpolate between 0 and 10 depending on elapsed time.

, , . , . , , fadeInWithDuration/fadeOutWithDuration, node node.

+6

@rickster. - apple spritekit ( → "" ).

- (SKSpriteNode *)newLight
{
    SKSpriteNode *light = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:CGSizeMake(8,8)];

    SKAction *blink = [SKAction sequence:@[
                                       [SKAction fadeOutWithDuration:0.25],
                                       [SKAction fadeInWithDuration:0.25]]];
    SKAction *blinkForever = [SKAction repeatActionForever:blink];
    [light runAction: blinkForever];

    return light;
}

"blinkForever" .

+1

, Swift4 SpriteKit:

let ITEM_MAX_BLUR_AMOUNT: CGFloat = 20
let ITEM_MIN_BLUR_AMOUNT: CGFloat = 0
let ITEM_FOCUS_DURATION: TimeInterval = 0.2

let effectNode: SKEffectNode = SKEffectNode()

effectNode.filter = CIFilter = CIFilter(name: "CIGaussianBlur")
effectNode.shouldEnableEffects = true
addChild(effectNode)

let focusAction = SKAction.customAction(withDuration: ITEM_FOCUS_DURATION, actionBlock: { (node : SKNode!, elapsedTime : CGFloat) -> Void in

    let fraction = CGFloat(elapsedTime / CGFloat(ITEM_FOCUS_DURATION))
    let deltaBlur: CGFloat = ITEM_MAX_BLUR_AMOUNT-ITEM_MIN_BLUR_AMOUNT
    let blurAmount = ITEM_MAX_BLUR_AMOUNT-deltaBlur*fraction
    (node as! SKEffectNode).filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

})

focusAction.timingMode = .easeIn
effectNode.run(focusAction)
0

Source: https://habr.com/ru/post/1547288/


All Articles