将背景模糊添加到SKSpriteNode(或SKScene)

时间:2016-04-06 15:18:13

标签: swift sprite-kit overlay blur scenekit

我在 SCNScene 上有 OverlayPanel SKScene 。此面板包含 SKSpriteNode 的颜色。我不知道如何向面板添加背景模糊效果。

This is the ColorPanel SKScene

另一个问题:我使用此方法添加面板:

 colorPanelScene = SKScene(fileNamed: "art.scnassets/ColorPanelScene")!
 SCNsceneView.overlaySKScene = colorPanelScene
 SCNsceneView.overlaySKScene!.userInteractionEnabled = true;

这是正确的方法还是我应该将面板创建为单独的UIView (并以简单的方式应用模糊效果)?

2 个答案:

答案 0 :(得分:6)

您可以在叠加场景中添加SKEffectsNode以达到此效果。

但这有点棘手,以你的方式加载它是不够的。

此方法仅适用于静态背景。基本上我们要做的是屏幕截图背景,并将其加载到SKEffectNode以使其模糊。

在SceneKit编辑器中,向场景中添加一个节点(确保它不是其他节点的子节点),并确保将此节点的类设置为带有名称的SKEffectNode,我将称之为EffectNode。在设计时,它应该具有最低zPosition

然后在代码中,您要执行以下操作:

if let effectNode = colorPanelScene.childNodeWithName("EffectNode") as? SKEffectNode {
    let  blur = CIFilter(name:"CIGaussianBlur",withInputParameters: ["inputRadius": 10.0]);
    effectNode.filter = blur;
    effectNode.shouldRasterize = true;
    effectNode.shouldEnableEffects = true;


    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0)
        view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let node = SKSpriteNode(texture:SKTexture(image: image));
    effectNode.addChild(node);
}

然后,在SKNode之上添加另一个SKEffectNode,但要确保它不是SKEffectNode的子项。将所有叠加元素放入此SKNode

答案 1 :(得分:4)

我会选择UIVisualEffectView。它具有UIKit和Core Animation人员的所有优秀优化,并且会使您的应用在平台上看起来一致。