2016-11-01 8 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' делают интеллектуальную, самоочевидную оптимизацию себя или нет. Я думаю, иногда они это делают. Но только угадывать, глядя на нечетные изменения в framerates. Я не часто вижу корреляцию между кадрами, показанными на экране, и инструментами отладки в Xcode. Но shouldRasterize ... должен заставить его сделать эту оптимизацию/предотвращение постоянного пересчета. Я надеюсь. Ура! – Confused