2016-01-22 10 views
6

私のタッチでメソッドを始めました。この単純な行のコードは、背景色を赤にします。バックグラウンドカラーを別の色にフェードインさせる別の方法

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

すべてが正常に動作しているが、問題は、コードが別の色に背景フェードを作成する別の方法である、またはあるかどう場合、私は思っていたIOS 7を使用して何もしないということですこのコードの7バージョンです。

+0

'colorizeWithColor'' SKAction'はiOS 7で利用できます。デバイスやシミュレータでテストしていますか? – 0x141E

+0

私は以前にこの問題のオーバーエンジニアリングされた解決策を思いついた... http://stackoverflow.com/a/21686221/2976878を参照してください – Hamish

+0

ありがとう、私は7でデバイスでそれをテストしていた – user302692

答えて

2

ある色から別の色に移行する方法は複数あります。最も簡単なアプローチの一つは、直線的に経時終了色の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で終了するこの方法を実現する一つの方法は、GameScenedidMoveToView方法にコードを追加することです。ただし、ゲームに複数のシーンが含まれている場合は、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にこれを追加します。