2016-04-06 8 views
2

Ich habe ein OverlayPanel SKScene auf einem SCNScene. Dieses Panel enthält Farben wie SKSpriteNode. Ich weiß nicht, wie man dem Panel einen Hintergrundunschärfe-Effekt hinzufügt.Hinzufügen von Hintergrundunschärfe zu einem SKSpriteNode (oder SKScene)

This is the ColorPanel SKScene

Eine weitere Frage: Ich benutze diese Methode das Panel hinzuzufügen:

colorPanelScene = SKScene(fileNamed: "art.scnassets/ColorPanelScene")! 
SCNsceneView.overlaySKScene = colorPanelScene 
SCNsceneView.overlaySKScene!.userInteractionEnabled = true; 

Ist dies der richtige Weg, oder sollte ich das Panel als separaten UIView erstellen (und gelten die Unschärfe Effekt auf eine einfachere Art)?

Antwort

6

Sie können Ihrer Overlay-Szene eine SKEffectsNode hinzufügen, um diesen Effekt zu erzielen.

Es ist ein wenig schwierig, wenn Sie es so laden, wie Sie es tun, wird nicht genug sein.

Diese Methode funktioniert nur, wenn der Hintergrund statisch ist. Im Grunde werden wir den Hintergrund screenen und in ein SKEffectNode laden, um es zu verwischen.

Fügen Sie im SceneKit-Editor einen Knoten zur Szene hinzu (stellen Sie sicher, dass er keine untergeordneten Knoten ist), und stellen Sie sicher, dass Sie die Klasse dieses Knotens als SKEffectNode mit einem Namen festlegen, ich werde es EffectNode nennen . Diese sollte beim Entwerfen die niedrigste zPosition haben.

dann in Code, möchten Sie folgendes tun:

if let effectNode = colorPanelScene.childNodeWithName("EffectNode") as? SKEffectNode { 
    let blur = CIFilter(name:"CIGaussianBlur",withInputParameters: ["inputRadius": 10.0]); 
    effectNode.filter = blur; 
    effectNode.shouldRasterize = true; 
    effectNode.shouldEnableEffects = true; 


    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0) 
     view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    let node = SKSpriteNode(texture:SKTexture(image: image)); 
    effectNode.addChild(node); 
} 

Dann fügen Sie eine weitere SKNode auf dem SKEffectNode, aber stellen Sie sicher, dass es nicht ein Kind des SKEffectNode ist. Werfen Sie alle Ihre Overlay-Elemente in diese .

+0

in Zeile "let node = SKSpriteNode (imageNamed: image);" xCode sagte: "Wert des Typs 'UIImage!' kann nicht konvertiert werden." to expected argument type 'String' " –

+1

Fehler behoben, habe vergessen, dass ich eine Textur erstellen soll – Knight0fDragon

4

Ich würde mit einem UIVisualEffectView gehen. Es hat all die netten Optimierungen der Jungs von UIKit und Core Animation und wird deine App auf der Plattform konsistent aussehen lassen.

+0

Meinen Sie mehr Ansichten? SCNScene + UIView mit Blur-Effekt? –

+1

ja. Eine 'SCNView', eine' UIVisualEffectView' und eine 'UIView' oder' SKView' für die UI. – mnuages

+0

könnte dies einfacher sein, aber vielleicht ist es weniger leistungsfähig. Ist das richtig? –