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 GameScene
didMoveToView
. 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
.
Il 'colorizeWithColor'' SKAction' è disponibile in iOS 7. Stai provando su un dispositivo o sul simulatore? – 0x141E
Un po 'di tempo fa ho trovato una soluzione ingegnerizzata a questo problema ... Vedi http://stackoverflow.com/a/21686221/2976878 – Hamish
Grazie, e lo stavo testando su un dispositivo con iOS 7 – user302692