使用SKEffectNode以增量方式模糊SKShapeNode

时间:2014-07-06 03:09:55

标签: ios swift sprite-kit skeffectnode

我试图在我的程序中模糊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)           
}

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

我同意@rickster。在苹果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"的行为。适合你的情况。

答案 2 :(得分:0)

你在这里交配,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)