为 SKSpriteNode 添加发光效果
Posted
技术标签:
【中文标题】为 SKSpriteNode 添加发光效果【英文标题】:Add glowing effect to an SKSpriteNode 【发布时间】:2017-03-14 17:14:08 【问题描述】:我在黑暗的屏幕上有一个移动的黑色图像,以便更容易看到我想为图像添加白光。这是我的动态图像代码:
Ghost = SKSpriteNode(imageNamed: "Ghost1")
Ghost.size = CGSize(width: 50, height: 50)
Ghost.position = CGPoint(x: self.frame.width / 2 - Ghost.frame.width, y: self.frame.height / 2)
Ghost.physicsBody = SKPhysicsBody(circleOfRadius: Ghost.frame.height / 1.4)
Ghost.physicsBody?.categoryBitMask = PhysicsCatagory.Ghost
Ghost.physicsBody?.collisionBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall
Ghost.physicsBody?.contactTestBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall | PhysicsCatagory.Score
Ghost.physicsBody?.affectedByGravity = false
Ghost.physicsBody?.isDynamic = true
Ghost.zPosition = 2
self.addChild(Ghost)
我不确定如何或使用什么来添加光晕,如果您需要更多信息,请询问。
【问题讨论】:
【参考方案1】:我创建了这个扩展来为 SKSpriteNode 添加发光效果
只需将其添加到您的项目中
extension SKSpriteNode
func addGlow(radius: Float = 30)
let effectNode = SKEffectNode()
effectNode.shouldRasterize = true
addChild(effectNode)
effectNode.addChild(SKSpriteNode(texture: texture))
effectNode.filter = CIFilter(name: "CIGaussianBlur", parameters: ["inputRadius":radius])
现在给定一个 SKSpriteNode
let sun = SKSpriteNode(imageNamed: "sun")
你必须做的一切
sun.addGlow()
【讨论】:
这是一个了不起的答案,超越了答案。这是对服务和洞察力的慷慨提供,也是对扩展思维内在力量的又一次惊人展示。谢谢!!!这还不够。添加!!!^3。性能查询:我已经修改了效果,并完成了手动将它们烘焙成纹理以用作精灵。这种模糊效果是否会更新每一帧。或者它们是否“烘焙”并简单地作为位图/精灵添加操作,除非底层对象(应用它们的对象)发生变化? @Confused:非常好的观点。我刚刚将此行添加到我的扩展程序effectNode.shouldRasterize = true
。现在只在第一次计算模糊效果,然后为下一帧缓存。当effectNode
内部发生变化时,缓存会自动失效(但这段代码不会发生)。
@Knight0fDragon:您可以将扩展名的可见性限制在使用fileprivate
声明的文件中
@DaveKliman:您可以将name
分配给 effectNode effectNode.name = "GlowEffect"
。稍后您可以检索它并将其隐藏childNode(withName: "GlowEffect")?.isHidden = true
@appzYorLife 嗯。我只是尝试将此代码添加到一段简单的代码中,该代码允许用户在屏幕上拖动卡片,但首先它基本上只是模糊了它们,并没有真正让它们看起来“亮起来”,其次,奇怪的是,有一次他们是模糊的,他们不会再拖拉。不知道为什么。【参考方案2】:
此外,您可以在任何类型的 SKNode 上执行此操作,方法是首先使用 SKView 实例上可用的 texture(from:SKNode) 方法渲染其内容。
例子:
extension SKNode
func addGlow(radius:CGFloat=30)
let view = SKView()
let effectNode = SKEffectNode()
let texture = view.texture(from: self)
effectNode.shouldRasterize = true
effectNode.filter = CIFilter(name: "CIGaussianBlur",withInputParameters: ["inputRadius":radius])
addChild(effectNode)
effectNode.addChild(SKSpriteNode(texture: texture))
【讨论】:
当我将它应用于移动的 SKNode 时,它会停止一段时间。我想这是因为这是性能问题。以上是关于为 SKSpriteNode 添加发光效果的主要内容,如果未能解决你的问题,请参考以下文章