2014-07-06 31 views
4

我試圖在我的程序中模糊SKShapenode。但是,我希望shapenode逐漸模糊,持續約1秒。我如何實現這一目標?當前的代碼立即模糊它。使用SKEffectNode增量式模糊SKShapeNode

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

回答

6

實現您的SKScene子類(或委託)的update方法。然後,在一秒的過程中,每個update方法被調用時再次運行這一行:

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

除了代替傳遞值10,基於所述經過的時間0和10之間內插。

您可能會發現,每幀重新渲染模糊會導致難以保持平滑的幀速率。所以你可以考慮僞造它。製作兩個節點,其中一個具有模糊效果,並使用fadeInWithDuration/fadeOutWithDuration動作淡入模糊節點並淡出未模糊節點。

1

我同意@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」的行爲以適合您的情況。

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)