向 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 的SCNView
、UIVisualEffectView
和 UIView
或 SKView
。
这可能更容易,但性能可能会降低。对吗?
不一定。 UIVisualEffectView
正是为此而创建并进行了调整,以便可以广泛使用。
我喜欢这种方法,但不幸的是,如果你有很多事情要做,它确实会影响 sprite kit 的性能,以上是关于向 SKSpriteNode(或 SKScene)添加背景模糊的主要内容,如果未能解决你的问题,请参考以下文章
在 SKScene 暂停时为 SKSpriteNode 的 alpha 设置动画
如何在 SKSpriteNode 中正确封装触摸事件处理并将数据传回 SKScene
在SKScene暂停时动画SKSpriteNode的alpha