为 SKSpriteNode 添加发光效果

问题描述 投票:0回答:3

我在黑屏幕上有一个移动的黑色图像,为了更容易看到,我想在图像中添加白色发光。这是我的移动图像代码:

   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)

我不知道如何或使用什么来添加发光,如果您需要更多信息,请询问。

ios swift sprite-kit cifilter skeffectnode
3个回答
36
投票

我创建了这个扩展来为 SKSpriteNode 添加发光效果

只需将其添加到您的项目中

extension SKSpriteNode {

    func addGlow(radius: Float = 30) {
        let effectNode = SKEffectNode()
        effectNode.shouldRasterize = true
        addChild(effectNode)
        let effect = SKSpriteNode(texture: texture)
        effect.color = self.color
        effect.colorBlendFactor = 1
        effectNode.addChild(effect)
        effectNode.filter = CIFilter(name: "CIGaussianBlur", parameters: ["inputRadius":radius])
    }
}

现在给出一个 SKSpriteNode

let sun = SKSpriteNode(imageNamed: "sun")

你所要做的一切

sun.addGlow()


5
投票

补充一下,您可以在任何类型的 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))
    }
}

0
投票

最近,当我将发光效果应用于 SKScene 中的各个节点时,我在 SwiftUI 项目中遇到了性能问题。我的场景是音频可视化应用程序的一部分,由多个 SKShapeNode 对象组成,这些对象根据音频输入更新每一帧。最初,我在 SKEffectNode 中使用 CIGaussianBlur 滤镜对每个节点应用发光效果,但这种方法导致了明显的滞后。

在尝试了不同的方法来优化性能之后,我找到了一个可以显着降低对性能影响的解决方案。我没有将发光效果应用于每个 SKShapeNode,而是将其应用于 SwiftUI 中的整个 SpriteView。这一变化带来了更加流畅的体验。这是我的实现方式:

SpriteView()
    .shadow(color: Color.white, radius: 10)

通过根据是否启用发光效果 (settings.isGlow) 将阴影修改器应用到 SpriteView 本身,并具有条件半径,我能够实现类似发光的效果,而无需单独处理每个节点而影响性能。

此方法可能对在 SwiftUI + SpriteKit 项目中处理类似性能问题的其他人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.