您想要的是在更大(例如 500 像素)渐变上看到较小(例如 200 像素)的窗口。为此,您只需要根据窗口在整体渐变中的位置计算四个角颜色的颜色,然后仅绘制它。 (所以不要考虑绘制整个背景,而要弄清楚如何仅绘制您需要的部分。)
由于您只是在两种颜色之间(0 到 500 之间)平滑移动,因此您正在根据 Window 的位置在颜色之间进行“线性插值”(即直线估计)。 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 对象,因此您可能需要对其进行优化以避免分配。
免责声明:我没有尝试过这段代码,所以它可能有一些愚蠢的错误,但希望它能给你正确的想法。