2016-11-01 84 views
12

我在黑屏上有一个移动的黑色图像,以便更容易看到我想为图像添加白光。这是我对运动图像的代码:将发光效果添加到SKSpriteNode

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) 

我不知道怎样还是怎样用来辉光添加,如果您需要了解更多信息请咨询。

回答

19

我创造了这个扩展辉光效果添加到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", withInputParameters: ["inputRadius":radius]) 
    } 
} 

现在给出一个SKSpriteNode

let sun = SKSpriteNode(imageNamed: "sun") 

你必须这样做

sun.addGlow() 

enter image description here

+3

这是一个惊人的答案,超出了答案。这是一项慷慨的服务加上洞察力,另一个令人惊叹的展现了扩展方面的内在思想。谢谢!!!这还不够。加!!! !!! 3。性能查询:我用特效修饰,并完成手动将它们烘焙成纹理以用作精灵。这是否会模糊效果更新每一帧。或者他们“烘烤”,只是作为一个位图/精灵的加法操作,除非它的基础对象(应用于它们)发生了变化? – Confused

+1

@Confused:非常好的一点。我只是将这一行添加到我的扩展'effectNode.shouldRasterize = true'。现在,仅在第一次计算模糊效果,然后为下一帧进行缓存。当'effectNode'内的内容发生变化时,缓存会自动失效(但这种情况不会发生)。 –

+0

再次感谢您。这是为我澄清。我不确定'effectNodes'是否智能,自我意识优化自己,或不。我想,有时候,他们会这样做。但是只能通过查看帧率的奇怪变化来猜测。我经常看不到屏幕上显示的帧率和Xcode中的调试工具之间的相关性。但是应该尽量......应该强制它进行不断重新计算的优化/预防。我希望。干杯! – Confused