5

プログラムで SKShapenode をぼかしようとしています。ただし、シェイプノードを約 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)           
}
4

3 に答える 3

6

サブクラス (またはデリゲート)updateでメソッドを実装します。SKScene次に、1 秒間にわたって、updateメソッドが呼び出されるたびに次の行を再度実行します。

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

value を渡す代わりに10、経過時間に基づいて 0 から 10 の間で補間します。

フレームごとにブラーを再レンダリングすると、スムーズなフレーム レートを維持することが難しくなる場合があります。したがって、代わりにそれを偽造することを検討してください。2 つのノードを作成し、そのうちの 1 つにぼかし効果があり、fadeInWithDuration/fadeOutWithDurationアクションを使用して、ぼかしたノードをフェードインし、ぼかしていないノードをフェードアウトします。

于 2014-07-06T04:44:03.793 に答える
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)
于 2017-11-15T12:01:34.627 に答える