向 SKSpriteNode(或 SKScene)添加背景模糊

Posted

技术标签:

【中文标题】向 SKSpriteNode(或 SKScene)添加背景模糊【英文标题】:Add background blur to a SKSpriteNode (or 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(并以更简单的方式应用模糊效果)?

【问题讨论】:

【参考方案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 的性能,

以上是关于向 SKSpriteNode(或 SKScene)添加背景模糊的主要内容,如果未能解决你的问题,请参考以下文章

在 SKScene 暂停时为 SKSpriteNode 的 alpha 设置动画

如何在 SKSpriteNode 中正确封装触摸事件处理并将数据传回 SKScene

在SKScene暂停时动画SKSpriteNode的alpha

在 SKScene 中间保留一个物理体?

是否可以将 SKSpriteNode 添加到另一个类的场景中?

如何使 SKSpriteNode 跟随另一个 SKSpriteNode