2016-08-04 5 views
2

Я пытаюсь размыть всю свою GameScene, когда нажата кнопка паузы. У меня есть метод, называемый blurSceen(), но он не добавляет эффект к сцене. Есть ли способ, которым я могу это сделать, или я делаю что-то неправильно? Я просмотрел другие сообщения по этой теме, но не смог добиться эффекта.SpriteKit - Добавление размытия во всю сцену

 func blurScreen() {  
      let effectsNode = SKEffectNode() 

      let filter = CIFilter(name: "CIGaussianBlur") 
      let blurAmount = 10.0 
      filter!.setValue(blurAmount, forKey: kCIInputRadiusKey) 

      effectsNode.filter = filter 
      effectsNode.position = self.view!.center 
      effectsNode.blendMode = .Alpha 

      // Add the effects node to the scene 
      self.addChild(effectsNode) 
     } 
+0

Возможно, вам следует рассмотреть вопрос размывания лишь некоторые из узлов в вашей сцене. Если вы размываете всю сцену, текст (например, оценка, статус игры) также будет размытым. Вот пример: http://stackoverflow.com/questions/26385156/how-to-blur-everything-except-2-nodes-spritekit-swift – Epsilon

+0

@ Эпсилон Это учебник, за которым я последовал, и ничто в моей сцене не появляется размыты после того, как я вызываю метод выше. – Brejuro

+0

Вы добавили узел как дочерний элемент 'effectsNode'? Только узлы, добавленные в узел эффектов, будут размыты. – Epsilon

ответ

3

От SKEffectNode docs:

SKEffectNode объект делает своих детей в буфер и необязательно применяет фильтр с сердечником изображения к этому воспроизведенной выходной.

Узел эффекта применяет фильтр только к его дочерним узлам. У вашего узла эффекта нет детей, поэтому не нужно применять фильтр.

Возможно, вы хотите добавить узел эффекта в свою сцену на раннем этапе - но не устанавливайте фильтр на нем еще - и поместите все узлы, которые вы позже захотите размыть, в качестве своих детей , Когда пришло время применить размытие, установите фильтр на узел (уже существующий, уже с дочерними).

+0

Но все, что мне нужно размыть, уже имеет родителя, который является самой сценой. – Brejuro

+0

Если вы хотите размыть * все *, вам повезло - 'SKScene' является подклассом' SKEffectNode', поэтому вы можете применять фильтры к самой сцене. Вам нужно добавить свой собственный узел эффекта только в том случае, если есть узлы, которые вы * не хотите размыты (в этом случае вы делаете вещи размытыми дочерними элементами узла эффекта и вещи, чтобы оставаться размытыми детьми какого-либо другого узла или сцены). – rickster

+0

Как бы это сделать? Я думал, что код, который у меня выше, сделал бы именно это. – Brejuro

1

У меня была такая же проблема, пытаясь размыть весь SKScene, и он просто не работал. Недостающая часть головоломки была эта линия:

shouldEnableEffects = true 
0

Swift 4:

из gameScene:

let blur = CIFilter(name:"CIGaussianBlur",withInputParameters: ["inputRadius": 10.0]) 
    self.filter = blur 
    self.shouldRasterize = true 
    self.shouldEnableEffects = true