2015-10-26 42 views
0

你好開發夥伴如何在sprite套件中緩慢轉換顏色?

我試圖在SpriteKit中慢慢地改變一個圓的顏色,從原始顏色到新顏色之間有一段時間的過渡,從一種顏色過渡到另一種顏色。我遇到的問題是我的代碼不會慢慢地改變,它只是改變,就好像我直接分配了新的顏色。這是我的實際代碼:

func changeColor(c: UIColor) { 
     var r:CGFloat = 0 
     var g:CGFloat = 0 
     var b:CGFloat = 0 
     var a:CGFloat = 0 
     c.getRed(&r, green: &g, blue: &b, alpha: &a) 

     var r1:CGFloat = 0 
     var g1:CGFloat = 0 
     var b1:CGFloat = 0 
     var a1:CGFloat = 0 
     circle.fillColor.getRed(&r1, green: &g1, blue: &b1, alpha: &a1); 
     let wait = SKAction.waitForDuration(0.4) 
     r = (r - r1)/10 
     g = (g - g1)/10 
     b = (b - b1)/10 

     for(var i = 0; i < 10; i++) { 
      let cN = UIColor(red: (r1 + r*CGFloat(i)), green: (g1 + g*CGFloat(i)), blue: (b1 + b*CGFloat(i)), alpha: 1.0) 
      circle.fillColor = cN 
      circle.strokeColor = cN 
      runAction(wait) 
     } 
    } 

我真的相信問題出在「runAction(wait)」,但我不確定。我想知道是否有一個默認功能可以做我想做的事,但我非常懷疑它。

回答

4

問題是,您正在試圖在for循環中執行所有「live」操作。您的功能中的所有代碼在動畫的幀之間運行,這樣就不起作用。

爲了使這個更清晰,讓我們暫時忽略wait部分。當你運行一個函數,看起來像這樣:

func changeColor() { // unrolled loop and pseudocode colors for clarity 
    circle.fillColor = blue 
    circle.fillColor = red 
    circle.fillColor = green 
} 

... SpriteKit 確實更改圓的顏色三次,立即,但不拉絲的結果。無論您將其設置爲最新的顏色只有在所有代碼運行完畢並且SpriteKit繪製屏幕後纔會顯示。

當您使用SKAction S,你在做什麼是排隊指令SpriteKit遵循隨着時間的推移,其中包括對需要多個動畫幀任務的說明。但代碼中的非SKAction調用仍然與以前相同 - 它們會立即進行更改,在下一幀繪製時您會看到最終結果。

所以,當你的代碼看起來是這樣的:

func changeColor() { // unrolled loop and pseudocode colors for clarity 
    circle.fillColor = blue 
    circle.runAction(SKAction.waitForDuration(0.4)) 
    circle.fillColor = red 
} 

...事件的順序是這樣的:

  1. 設置顏色爲藍色
  2. 添加等待行動的計劃動作列表
  3. 設置顏色爲紅色
  4. 繪製下一幀(顏色爲紅色)
  5. 執行計劃的行動清單(等待0.4秒執行中的下一個動作之前)

所以,要做的第一件事情是讓你的顏色變化停下來是幀間的變化,並把它們添加到超時任務列表 - 即通過SKAction更改顏色。有一個colorizeWithColor動作,但我不確定它是否適用於形狀節點(使用它們的單獨填充/筆觸顏色)。嘗試一下,如果失敗,您可以嘗試runBlock 操作,直接設置fillColor/strokeColor

返回僞代碼來討論排序問題,雖然...

func changeColor() { // unrolled loop and pseudocode color actions 
    circle.runAction(mySetBlueColorAction) 
    circle.runAction(SKAction.waitForDuration(0.4)) 
    circle.runAction(mySetRedColorAction) 
} 

如果你運行這個,你會發現這裏仍然存在問題。只需撥打runAction單獨行動(大致)並行。所以你的圈子還在兩次改變顏色,但是兩個變化都在同一時間發生。 (哪一個勝利?我不確定有一個確定的答案。)同時,當你的圈子對它的顏色感到困惑時,它也開始等待0.4秒......究竟是什麼?

一個waitForDuration行動纔有意義,在上下文中的sequence行動,它是有意義的,有需要的東西后,按順序等待

所以,如果你希望發生的事情聽起來像這個順序是什麼:

  1. 設置顏色
  2. 等一等
  3. 顏色設置爲別的

...那麼你需要的是一個序列動作描述你想要按順序發生的事情:

let sequence = SKAction.sequence([ 
    mySetBlueColorAction, 
    SKAction.waitForDuration(0.4), 
    mySetRedColorAction, 
    SKAction.waitForDuration(0.4), 
    mySetGreenColorAction, 
    // etc. 
]) 
+0

謝謝你們長期以來精心構思的解說大師,明天我會嘗試你的建議,我會讓你知道結果 – Adri