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
.
Die 'colorizeWithColor'' SKAction' ist in iOS 7 verfügbar. Testen Sie auf einem Gerät oder dem Simulator? – 0x141E
Ich kam vor einiger Zeit mit einer überentwickelten Lösung für dieses Problem ... Siehe http://stackoverflow.com/a/21686221/2976878 – Hamish
Danke, und ich habe es auf einem Gerät mit iOS 7 getestet – user302692