2016-07-26 14 views
1

Ich programmiere ein Spiel, bei dem der Benutzer, wenn er verliert, einen Reset-Knopf in der Mitte des Bildschirms hat und der Rest davon abgeblendet ist. Aus irgendeinem Grund kann ich keine Transparenz für die Arbeit bekommen. Ich habe Lösungen gesucht, aber konnte es nicht mit meinem zu arbeiten (es gibt zu viele Variablen, die nicht definiert sind) und kann ich nicht kommentieren, weil ich nicht genug rep tun:Dimmen von SKScene durch Hinzufügen von SKScene/SKView oder UIView auf der Oberseite funktioniert nicht

Making a SKScene's background transparent not working... is this a bug?

Ich habe eine Spieleszene, die SKScene erweitert, wo ich alle meine SKNodes zu einem Hauptansichtsknoten hinzufüge. Ich habe versucht, die Transparenz auf YES setzen und das Hinzufügen eines neuen skscene mit Clear oben drauf, aber es zeigt nur einen schwarzen Bildschirm:

SKView *dimView = [[SKView alloc] initWithFrame:self.frame]; 
[self.view addSubview:dimView]; 
[dimView setBackgroundColor:[UIColor clearColor]]; 
[dimView setAllowsTransparency:YES]; 

Ich weiß, ich mache etwas falsch, ich weiß nicht genau, was es ist. Kann jemand meinen Fehler lokalisieren?

Update:

Ich habe dies auch versucht, und es funktioniert auch nicht, auch schwarzer Bildschirm:

CGRect screenRect = [[UIScreen mainScreen] bounds]; 
//create a new view with the same size 
UIView* coverView = [[UIView alloc] initWithFrame:screenRect]; 
// change the background color to black and the opacity to 0.6 
coverView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6]; 
// add this new view to your main view 
[self.view addSubview:coverView]; 

Update 2:

ich den ersten Codesatz bearbeitet haben zu versuchen, die SK-Ansicht mit einer anderen SK-Ansicht zu überlagern, deren Transparenz auf "True" eingestellt ist und die Farbe auf "Clear" eingestellt ist. Auf diese Weise bekomme ich nur einen grauen Bildschirm. Ich bin schon eine Weile hier und kann wirklich nicht herausfinden, warum das nicht funktioniert. Jede Hilfe wäre willkommen.

Update 3:

Also ich denke, die korrekte Umsetzung der eine Ansicht mit einer anderen über wie so ist, aber auch mit dieser es zeigt immer noch ein völlig schwarzer Bildschirm:

CGRect screenFrame = [UIScreen mainScreen].bounds; 
    SKView *dimView = [[SKView alloc] initWithFrame:screenFrame]; 
    SKScene *currentScene = [[SKScene alloc]initWithSize:dimView.bounds.size]; 
    [self.view addSubview:dimView]; 
    [currentScene setBackgroundColor:[[UIColor clearColor] colorWithAlphaComponent:0.5f]]; 
    [dimView setAllowsTransparency:YES]; 
    [dimView presentScene:currentScene]; 

Antwort

0

Habe ich es finially OUT!Mein Problem war, dass ich meinen Code in der Update-Methode hatte und nicht überprüft, ob es bereits hinzugefügt wurde. Ich fügte jeder Iteration der Update-Schleife mehrere Ansichten hinzu, alle mit einer Deckkraft von .5, wodurch sie schwarz erschien.

+0

Es kann allen passieren. Also, gute Nachrichten. –

0

Nach Übersicht Abschnitt Die SKScene Class Reference:

Ein SKScene-Objekt repräsentiert eine Szene des Inhalts in Sprite Kit. Eine Szene ist der Wurzelknoten in einer Struktur von Sprite Kit-Knoten (SKNode). Diese Knoten stellen Inhalte bereit, die von der Szene animiert und zur Anzeige gerendert werden. Um eine Szene anzuzeigen, präsentieren Sie sie von einem SKView-Objekt.

Sie verschachteln nicht SKScene 's. Sie können nicht zwei Szenen gleichzeitig ausführen lassen (nur zwischen ihnen wechseln).

Wenn Sie zwei Szenen "überlagern" möchten, müssen Sie immer von einem Übergang wechseln.

Eine Alternative ein GitHub Projekt sein könnte Übergang Szene mit Shadern SpriteKitShaderTransitionExample

genannt anpassen Wie Sie aus den Quellen unten sehen können, ist es die SKScene erweitert den Shader zu integrieren.

Quelle:

//private let totalAnimationDuration = 1.0 
private let kNodeNameTransitionShaderNode = "kNodeNameTransitionShaderNode" 
private let kNodeNameFadeColourOverlay = "kNodeNameFadeColourOverlay" 
private var presentationStartTime: CFTimeInterval = -1 
private var shaderChoice = -1 

extension SKScene { 
    private var transitionShader: SKShader? { 
     get { 
      if let shaderContainerNode = self.childNodeWithName(kNodeNameTransitionShaderNode) as? SKSpriteNode { 
       return shaderContainerNode.shader 
      } 
      return nil 
     } 
    } 
    private func createShader(shaderName: String, transitionDuration: NSTimeInterval) -> SKShader { 
     var shader = SKShader(fileNamed:shaderName) 
     var u_size = SKUniform(name: "u_size", floatVector3: GLKVector3Make(Float(UIScreen.mainScreen().scale * size.width), Float(UIScreen.mainScreen().scale * size.height), Float(0))) 
     var u_fill_colour = SKUniform(name: "u_fill_colour", floatVector4: GLKVector4Make(131.0/255.0, 149.0/255.0, 255.0/255.0, 1.0)) 
     var u_border_colour = SKUniform(name: "u_border_colour", floatVector4: GLKVector4Make(104.0/255.0, 119.0/255.0, 204.0/255.0, 1.0)) 
     var u_total_animation_duration = SKUniform(name: "u_total_animation_duration", float: Float(transitionDuration)) 
     var u_elapsed_time = SKUniform(name: "u_elapsed_time", float: Float(0)) 
     shader.uniforms = [u_size, u_fill_colour, u_border_colour, u_total_animation_duration, u_elapsed_time] 
     return shader 
    } 
    func presentScene(scene: SKScene?, shaderName: String, transitionDuration: NSTimeInterval) { 
     // Create shader and add it to the scene 
     var shaderContainer = SKSpriteNode(imageNamed: "dummy") 
     shaderContainer.name = kNodeNameTransitionShaderNode 
     shaderContainer.zPosition = 9999 // something arbitrarily large to ensure it's in the foreground 
     shaderContainer.position = CGPointMake(size.width/2, size.height/2) 
     shaderContainer.size = CGSizeMake(size.width, size.height) 
     shaderContainer.shader = createShader(shaderName, transitionDuration:transitionDuration) 
     self.addChild(shaderContainer) 
     // remove the shader from the scene after its animation has completed. 
     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(transitionDuration * Double(NSEC_PER_SEC))) 
     dispatch_after(delayTime, dispatch_get_main_queue(), {() -> Void in 
      var fadeOverlay = SKShapeNode(rect: CGRectMake(0, 0, self.size.width, self.size.height)) 
      fadeOverlay.name = kNodeNameFadeColourOverlay 
      fadeOverlay.fillColor = SKColor(red: 131.0/255.0, green: 149.0/255.0, blue: 255.0/255.0, alpha: 1.0) 
      fadeOverlay.zPosition = shaderContainer.zPosition 
      scene!.addChild(fadeOverlay) 
      self.view!.presentScene(scene) 
     }) 
     // Reset the time presentScene was called so that the elapsed time from now can 
     // be calculated in updateShaderTransitions(currentTime:) 
     presentationStartTime = -1 
    } 
    func updateShaderTransition(currentTime: CFTimeInterval) { 
     if let shader = self.transitionShader { 
      let elapsedTime = shader.uniformNamed("u_elapsed_time")! 
      if (presentationStartTime < 0) { 
       presentationStartTime = currentTime 
      } 
      elapsedTime.floatValue = Float(currentTime - presentationStartTime) 
     } 
    } 
    // this function is called by the scene being transitioned to when it's ready to have the view faded in to the scene i.e. loading is complete, etc. 
    func completeShaderTransition() { 
     if let fadeOverlay = self.childNodeWithName(kNodeNameFadeColourOverlay) { 
      fadeOverlay.runAction(SKAction.sequence([SKAction.fadeAlphaTo(0, duration: 0.3), SKAction.removeFromParent()])) 
     } 
    } 
} 
+0

Ich möchte nicht unbedingt zwei Szenen überlagern, was ich eigentlich will, ist eine Ansicht mit einer anderen Ansicht zu überlagern, wo die Ansicht auf der Oberseite eine schwarze Farbe mit einer .5-.6 Deckkraft ist. Dies dient dazu, dem Hintergrund einen gedämpften Effekt zu geben, wenn der Benutzer das Spiel verliert. Mit dem obigen Code konnte ich dies nicht erreichen, da die überlagernde Szene immer undurchsichtig ist. – Minimi

+0

Ich verstehe dich nicht, was meinst du? Du musst UIKit vom Sprite-Kit unterscheiden, also was bekommst du eigentlich? –

+1

Sorry für die Verwirrung, ich habe versucht, meine SKScene mit einem anderen SKView zu überlagern, aber das scheint nicht zu funktionieren, es ist nicht transparent. Ich habe auch versucht, meine SKScene mit einer UIView zu überlagern, aber das ist auch nicht transparent. Ich möchte, dass meine SKScene-Knoten durch eine andere Ansicht oder Szene sichtbar sind. Mir ist es egal, welche. Der Effekt, nach dem ich suche, ist ein dunkler Effekt für meine ursprüngliche Szene. – Minimi

Verwandte Themen