将背景模糊添加到 SKSpriteNode(或 SKScene)
Add background blur to a SKSpriteNode (or SKScene)
我在 SCNScene 上有一个 OverlayPanel SKScene。此面板包含 SKSpriteNode 的颜色。不知道怎么给面板加背景虚化效果
另外一个问题:我是用这个方法添加面板的:
colorPanelScene = SKScene(fileNamed: "art.scnassets/ColorPanelScene")!
SCNsceneView.overlaySKScene = colorPanelScene
SCNsceneView.overlaySKScene!.userInteractionEnabled = true;
这是正确的方法还是我应该将面板创建为 单独的 UIView(并以更简单的方式应用模糊效果)?
您可以在叠加场景中添加一个 SKEffectsNode
来实现此效果。
虽然有点棘手,但按照您的方式加载它是不够的。
此方法仅适用于静态背景。基本上我们要做的是截屏背景,并将其加载到 SKEffectNode
中使其模糊。
在 SceneKit 编辑器中,向场景添加一个节点(确保它不是其他节点的子节点)并确保将此节点的 class 设置为 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);
}
然后,在 SKEffectNode
之上添加另一个 SKNode
,但要确保它不是 SKEffectNode
的子项。将所有叠加元素放入此 SKNode
.
我会选择 UIVisualEffectView
。它拥有 UIKit 和 Core Animation 人员的所有出色优化,将使您的应用在平台上看起来一致。
我在 SCNScene 上有一个 OverlayPanel SKScene。此面板包含 SKSpriteNode 的颜色。不知道怎么给面板加背景虚化效果
另外一个问题:我是用这个方法添加面板的:
colorPanelScene = SKScene(fileNamed: "art.scnassets/ColorPanelScene")!
SCNsceneView.overlaySKScene = colorPanelScene
SCNsceneView.overlaySKScene!.userInteractionEnabled = true;
这是正确的方法还是我应该将面板创建为 单独的 UIView(并以更简单的方式应用模糊效果)?
您可以在叠加场景中添加一个 SKEffectsNode
来实现此效果。
虽然有点棘手,但按照您的方式加载它是不够的。
此方法仅适用于静态背景。基本上我们要做的是截屏背景,并将其加载到 SKEffectNode
中使其模糊。
在 SceneKit 编辑器中,向场景添加一个节点(确保它不是其他节点的子节点)并确保将此节点的 class 设置为 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);
}
然后,在 SKEffectNode
之上添加另一个 SKNode
,但要确保它不是 SKEffectNode
的子项。将所有叠加元素放入此 SKNode
.
我会选择 UIVisualEffectView
。它拥有 UIKit 和 Core Animation 人员的所有出色优化,将使您的应用在平台上看起来一致。