2016-01-22 5 views
6

nei miei tocchi ha iniziato il metodo ho messo questa semplice linea di codice che sfuma il colore di sfondo al rosso.Modo alternativo per sfumare il colore di sfondo in un altro colore

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

tutto funziona bene, ma il problema è che il codice non fa nulla utilizzando iOS 7. Mi chiedevo se esiste un modo alternativo per fare la dissolvenza di sfondo in un colore diverso, o se c'è una versione ios 7 di questo codice.

+0

Il 'colorizeWithColor'' SKAction' è disponibile in iOS 7. Stai provando su un dispositivo o sul simulatore? – 0x141E

+0

Un po 'di tempo fa ho trovato una soluzione ingegnerizzata a questo problema ... Vedi http://stackoverflow.com/a/21686221/2976878 – Hamish

+0

Grazie, e lo stavo testando su un dispositivo con iOS 7 – user302692

risposta

2

Esistono diversi modi per passare da un colore a un altro. Uno degli approcci più semplici è quello di interpolare linearmente tra i due colori combinando una frazione progressivamente maggiore di componenti RGB del colore iniziando con una frazione progressivamente minore di componenti RBG del colore finale nel tempo:

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 

dove fraction inizia a 0 e termina a 1 con incrementi di

fraction += delta_time * step_size 

Un modo per implementare questo approccio è quello di aggiungere codice al metodo di GameScenedidMoveToView. Tuttavia, se il tuo gioco contiene più scene, una strategia migliore è quella di estendere SKAction per aggiungere un metodo di classe che crea un'azione personalizzata, in modo che possa essere utilizzato da tutte le scene.

Innanzitutto, definire una struttura per memorizzare i componenti di colore RGB iniziali e finali. Aggiungi questo al di fuori della definizione di GameScene.

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 
    } 
} 

Poi, estendere SKAction aggiungendo il seguente metodo che cambia il colore di sfondo a un altro colore. Nota che le estensioni devono essere definite al di fuori di una classe.

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 
    } 
} 

Infine, creare ed eseguire un SKAction

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

aggiungere questo al didMoveToView nelle vostre SKScene sottoclassi, come ad esempio GameScene.