ある色から別の色に移行する方法は複数あります。最も簡単なアプローチの一つは、直線的に経時終了色のRBG成分の徐々に小さくなる分数で始まる色のRGB成分の漸進的に大きな部分を組み合わせることにより、2つの色の間を補間することである。
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
fraction
開始0時および
fraction += delta_time * step_size
ずつ1で終了するこの方法を実現する一つの方法は、GameScene
のdidMoveToView
方法にコードを追加することです。ただし、ゲームに複数のシーンが含まれている場合は、SKAction
を拡張してカスタムアクションを作成するクラスメソッドを追加し、すべてのシーンで使用できるようにすることをおすすめします。
まず、開始および終了RGBカラーコンポーネントを格納する構造体を定義します。 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
}
}
そして、別の色に背景色を変更する次のメソッドを追加することによってSKAction
を拡張します。拡張機能はクラス外で定義する必要があることに注意してください。
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
}
}
最後には、SKAction
runAction(SKAction.changeColor(backgroundColor, endColor: SKColor.blueColor(), duration: 5))
を作成して実行などGameScene
として、あなたのSKScene
サブクラスでdidMoveToView
にこれを追加します。
'colorizeWithColor'' SKAction'はiOS 7で利用できます。デバイスやシミュレータでテストしていますか? – 0x141E
私は以前にこの問題のオーバーエンジニアリングされた解決策を思いついた... http://stackoverflow.com/a/21686221/2976878を参照してください – Hamish
ありがとう、私は7でデバイスでそれをテストしていた – user302692