【问题标题】:Drawing subset of a gradient in libgdx在 libgdx 中绘制渐变的子集
【发布时间】:2014-12-07 16:03:32
【问题描述】:

我知道这个问题以前曾被访问过(如here),但我想知道如何执行以下操作。在我的游戏中,我有一个滚动背景。例如,底部是浅蓝色的蓝天,越高越深。建议的解决方案实际上不可能做到这一点:

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

因为你只能给出真正会显示的颜色。我想有一个渐变油漆,顶部为深蓝色,底部为浅蓝色,延伸超过例如 500 像素。这个,虽然我只画了 200 个像素。这样,当背景滚动时颜色仍然会变暗。有人知道如何用 libgdx 做到这一点吗?

【问题讨论】:

    标签: java android graphics libgdx


    【解决方案1】:

    您想要的是在更大(例如 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);
    

    现在windowBottomColorwindowTopColor 应该适合调用filledRect:

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

    请注意,“copy()”调用会为每次调用创建一个新的 Color 对象,因此您可能需要对其进行优化以避免分配。

    免责声明:我没有尝试过这段代码,所以它可能有一些愚蠢的错误,但希望它能给你正确的想法。

    【讨论】:

    • 非常感谢您的回答。正如你所解释的那样工作。
    • 为了避免在每个游戏循环中创建新的颜色对象,我创建了一个带有缓存颜色的哈希图。由于关卡以块为单位细分,因此块顶部和底部的所有颜色都会被保存。
    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2012-08-14
    • 2014-10-22
    • 2021-12-22
    • 2018-09-24
    相关资源
    最近更新 更多