2014-12-07 71 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