2016-01-22 1 views
6

in meinen Berührungen begann Methode Ich lege diese einfache Linie von Code, der die Hintergrundfarbe zu rot verblasst.Alternative Möglichkeit, die Hintergrundfarbe in eine andere Farbe zu verblassen

runAction(SKAction.colorizeWithColor(SKColor.redColor(), colorBlendFactor: 1.0, duration: 1.0)) 

alles funktioniert gut, aber das Problem ist, dass der Code nichts tut ios mit 7. Ich frage mich, ob es eine alternative Möglichkeit, die Hintergrundausblendung in eine andere Farbe zu machen, oder wenn es gibt eine ios 7-Version dieses Codes.

+0

Die 'colorizeWithColor'' SKAction' ist in iOS 7 verfügbar. Testen Sie auf einem Gerät oder dem Simulator? – 0x141E

+0

Ich kam vor einiger Zeit mit einer überentwickelten Lösung für dieses Problem ... Siehe http://stackoverflow.com/a/21686221/2976878 – Hamish

+0

Danke, und ich habe es auf einem Gerät mit iOS 7 getestet – user302692

Antwort

2

Es gibt mehrere Möglichkeiten zum Übergang von einer Farbe zu einer anderen. Eine der einfachsten Methoden ist linear zwischen den beiden Farben zu interpolieren, um einen zunehmend größeren Anteil der Ausgangsfarbe RGB-Komponenten mit einem immer kleiner Bruchteil der Endfarbe der RBG-Komponenten im Laufe der Zeit die Kombination:

red = starting_red * (1.0 - fraction) + ending_red * fraction 
green = starting_green * (1.0 - fraction) + ending_green* fraction 
blue = starting_blue * (1.0 - fraction) + ending_blue * fraction 

wo fraction beginnt bei 0 und endet bei 1 in Schritten von

fraction += delta_time * step_size 

Eine Möglichkeit, diesen Ansatz zu implementieren, ist Code in die didMoveToView Methode von GameScene hinzuzufügen. Wenn Ihr Spiel jedoch mehrere Szenen enthält, besteht eine bessere Strategie darin, SKAction zu erweitern, um eine Klassenmethode hinzuzufügen, die eine benutzerdefinierte Aktion erstellt, sodass sie von allen Szenen verwendet werden kann.

Definieren Sie zunächst eine Struktur zum Speichern der RGB-Startkomponenten und -Endfarbenkomponenten. Füge dies außerhalb der Definition von GameScene hinzu.

struct ColorComponents { 
    var red:CGFloat 
    var green:CGFloat 
    var blue:CGFloat 

    init(color:SKColor) { 
     self.init() 
     var alpha:CGFloat = 0 
     color.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 
    } 

    init() { 
     red = 0 
     green = 0 
     blue = 0 
    } 
} 

Dann erstrecken SKAction durch das folgende Verfahren hinzu, dass die Hintergrundfarbe in einer anderen Farbe ändert. Beachten Sie, dass Erweiterungen außerhalb einer Klasse definiert werden müssen.

extension SKAction { 
    static func changeColor(startColor:SKColor, endColor:SKColor, duration:NSTimeInterval) -> SKAction { 
     // Extract and store starting and ending colors' RGB components 
     let start = ColorComponents(color: startColor) 
     let end = ColorComponents(color: endColor) 
     // Compute the step size 
     let stepSize = CGFloat(1/duration) 
     // Define a custom class to gradually change a scene's background color 
     let change = SKAction.customActionWithDuration(duration) { 
      node, time in 
      let fraction = time * stepSize 
      let red = start.red * (1.0 - fraction) + end.red * fraction 
      let green = start.green * (1.0 - fraction) + end.green * fraction 
      let blue = start.blue * (1.0 - fraction) + end.blue * fraction 
      if let scene = node as? SKScene { 
       scene.backgroundColor = SKColor(red: red, green: green, blue: blue, alpha: 1.0) 
      } 
     } 
     return change 
    } 
} 

Schließlich schaffen und ein SKAction

runAction(SKAction.changeColor(backgroundColor, endColor: SKColor.blueColor(), duration: 5)) 

dies in Ihrem SKScene Subklassen didMoveToView laufen hinzufügen, wie GameScene.