你想要的是看到一个较小(比如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);
现在windowBottomColor
和windowTopColor
应适合调用filledRect:
shapeRenderer.filledRect(x, y, width, height,
windowBottomColor, windowBottomColor, windowTopColor, windowTopColor);
注意“copy()”调用会为每个调用创建一个新的Color对象,因此您可能需要优化它以避免分配。免责声明:我还没有试过这个代码,所以它可能有一些愚蠢的错误,但希望它给你正确的想法。
非常感谢您的回答。它按照你的解释工作。 – Consec 2014-12-09 20:50:55
至于避免每个gameloop创建新的颜色对象,我创建了缓存颜色的散列表。由于水平被细分为块,块的顶部和底部的所有颜色都被保存。 – Consec 2014-12-09 21:38:44