swift 为SKSpriteNode添加发光效果

ttcibm8c  于 12个月前  发布在  Swift
关注(0)|答案(3)|浏览(119)

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

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)

字符串
我不知道如何或用什么来添加在一个发光,如果你需要更多的信息,请询问。

ej83mcc0

ej83mcc01#

我创建这个扩展是为了给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()


的数据

yc0p9oo0

yc0p9oo02#

另外,您可以在任何类型的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))
    }
}

字符串

kmpatx3s

kmpatx3s3#

最近,我在SwiftUI项目中遇到了一个性能问题,即在SKScene中对单个节点应用辉光效果。我的场景是音频可视化应用程序的一部分,由多个SKShapeNode对象组成,这些对象根据音频输入更新每个帧。最初,我使用SKShapeNode中的CIGaussianBlur过滤器对每个节点应用辉光效果,但这种方法导致了显著的延迟。
在尝试了不同的方法来优化性能后,我发现了一种解决方案,它可以显著降低对性能的影响。我没有将辉光效果应用到每个SKShapeNode,而是将其应用到SwiftUI中的整个SpriteView。这种变化带来了更流畅的体验。下面是我如何实现的:

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

字符串
通过将阴影修改器应用于SpriteView本身的半径,我能够实现类似辉光的效果,而不会单独处理每个节点的性能。
这种方法可能对其他在SwiftUI + SpriteKit项目中处理类似性能问题的人有帮助。

相关问题