使用 SKEffectNode 逐渐模糊 SKShapeNode

Posted

技术标签:

【中文标题】使用 SKEffectNode 逐渐模糊 SKShapeNode【英文标题】:Blurring a SKShapeNode incrementally using SKEffectNode 【发布时间】:2014-07-06 03:09:54 【问题描述】:

我试图在我的程序中模糊一个 SKShapenode。但是,我希望 shapenode 逐渐模糊,持续时间约为 1 秒。我该如何做到这一点?当前代码立即将其模糊。

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)           

【问题讨论】:

【参考方案1】:

在您的SKScene 子类(或委托)中实现update 方法。然后,在一秒钟内,每次调用 update 方法时再次运行此行:

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

除了传递值10 之外,根据经过的时间在 0 和 10 之间进行插值。

您可能会发现,每帧都重新渲染模糊会导致难以保持平滑的帧速率。所以你可能会考虑假装它。制作两个节点,其中一个有模糊效果,使用fadeInWithDuration/fadeOutWithDuration动作淡入模糊节点,淡出未模糊节点。

【讨论】:

【参考方案2】:

我同意@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”的行为以适合您的情况。

【讨论】:

【参考方案3】:

给你,伙计,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)

【讨论】:

以上是关于使用 SKEffectNode 逐渐模糊 SKShapeNode的主要内容,如果未能解决你的问题,请参考以下文章

图片逐渐由看不见到模糊,最后清晰显示;鼠标点击图片后,图片依照1234顺序依次循环显示;鼠标移入图片区域,图片放大

如何使用 CGContext 模糊线条的边缘

径向模糊(Radial Blur)

高斯模糊效果

渐变模糊效果

模糊预测股价走势