为 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 添加发光效果的主要内容,如果未能解决你的问题,请参考以下文章

按下时向 SKSpriteNode 添加视觉效果

用PS给图标添加外发光效果

自定义控件三部曲之绘图篇(十六)——给控件添加阴影效果与发光效果

如何为 OpenGL 的线条添加发光效果? [关闭]

使用内部阴影的 UILabel 中的发光效果

向UIButton添加发光效果-iOS