【问题标题】:Add background blur to a SKSpriteNode (or SKScene)向 SKSpriteNode(或 SKScene)添加背景模糊
【发布时间】:2016-07-27 02:35:22
【问题描述】:

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

另一个问题:我用这种方法添加面板:

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

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

【问题讨论】:

    标签: swift sprite-kit overlay blur scenekit


    【解决方案1】:

    您可以在叠加场景中添加SKEffectsNode 来实现此效果。

    虽然有点棘手,但按照你的方式加载它是不够的。

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

    在 SceneKit 编辑器中,向场景中添加一个节点(确保它不是其他节点的子节点)并确保将此节点的类设置为带有名称的SKEffectNode,我将其命名为效果节点。这在设计时应该有最低的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);
    }
    

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

    【讨论】:

    • 在“让节点 = SKSpriteNode(imageNamed:image);”行xCode 说:“无法转换 'UIImage!' 类型的值!到预期的参数类型“字符串””
    • 修好了,忘了做纹理
    【解决方案2】:

    我会选择UIVisualEffectView。它拥有来自 UIKit 和 Core Animation 人员的所有出色优化,将使您的应用在平台上看起来一致。

    【讨论】:

    • 您的意思是添加更多视图吗? SCNScene + UIView 有模糊效果?
    • 是的。用于 UI 的 SCNViewUIVisualEffectViewUIViewSKView
    • 这可能更容易,但性能可能会降低。对吗?
    • 不一定。 UIVisualEffectView 正是为此而创建并进行了调整,以便可以广泛使用。
    • 我喜欢这种方法,但不幸的是,如果你有很多事情要做,它确实会影响 sprite kit 的性能,
    猜你喜欢
    • 2022-11-23
    • 2015-09-06
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2022-09-26
    • 2014-06-02
    • 2021-09-04
    • 2019-04-11
    相关资源
    最近更新 更多