2014-12-07 94 views
0

我知道這個問題之前已經被訪問過(例如here),但是我想知道如何執行以下操作。在我的遊戲中,我有一個滾動背景。例如,藍色的天空在底部是淺藍色,而在你走得越高的時候越暗。建議的解決方案實際上並不可行:在libgdx中繪製漸變的子集

shapeRenderer.filledRect(x, y, width, height, 
         lightBlue, lightBlue, darkBlue, darkBlue); 

因爲您只能給出真正顯示的顏色。我想要在頂部深藍色和底部淺藍色之間有一個gradientPaint,例如500像素。這,雖然我只畫出它的200個像素。有了這個,背景滾動時顏色仍然會變暗。有誰知道如何用libgdx做到這一點?

回答

2

你想要的是看到一個較小(比如200像素)的窗口到更大的(比如500像素)的漸變。要做到這一點,你只需要根據窗口在整個漸變中的位置來計算四角色的顏色,然後繪製出來。 (所以不要考慮繪製整個背景,而是要弄清楚如何繪製所需的部分)。

由於您只是在兩種顏色(0和500之間)之間平穩移動,因此您根據窗口的位置在顏色之間進行「線性插值」(即直線估計)。 Libgdx通過lerp() methods on Color支持這一點。

假設窗口沿Y軸行進,這樣的事情應該給你想要的東西:

Color baseColor = lightBlue; 
Color topColor = darkBlue; 

int skyHeight = 500; 
int windowHeight = 200; 
int windowLocation = ...; // something betweeen 0 and skyHeight - windowHeight; 
Color windowBottomColor = baseColor.copy().lerp(topColor, windowLocation/skyHeight); 
Color windowTopColor = baseColor.copy().lerp(topColor, (windowLocation + windowHeight)/skyHeight); 

現在windowBottomColorwindowTopColor應適合調用filledRect:

shapeRenderer.filledRect(x, y, width, height, 
         windowBottomColor, windowBottomColor, windowTopColor, windowTopColor); 

注意「copy()」調用會爲每個調用創建一個新的Color對象,因此您可能需要優化它以避免分配。免責聲明:我還沒有試過這個代碼,所以它可能有一些愚蠢的錯誤,但希望它給你正確的想法。

+0

非常感謝您的回答。它按照你的解釋工作。 – Consec 2014-12-09 20:50:55

+0

至於避免每個gameloop創建新的顏色對象,我創建了緩存顏色的散列表。由於水平被細分爲塊,塊的頂部和底部的所有顏色都被保存。 – Consec 2014-12-09 21:38:44