在Libgdx中绘制渐变

时间:2014-01-02 18:25:19

标签: java android eclipse opengl-es-2.0 libgdx

好的,我有这段代码

@Override
public void render() {
    // do not update game world when paused
    if (!paused) {
        // Update game world by the time that has passed
        // since last render frame
        worldController.update(Gdx.graphics.getDeltaTime());
    }
    // Sets the clear screen color to: Cornflower Blue
    Gdx.gl.glClearColor(0x64/255.0f, 0x95/255.0f, 0xed/255.0f,
            0xff/255.0f);
    // Clears the screen
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    // Render game world to screen
    worldRenderer.render();
}

它在屏幕上绘制浅蓝色背景。我试图创建一个从顶部的深蓝色到底部的浅蓝色的渐变。有一个简单的方法吗?我是Libgdx和OpenGL的新手,所以我试图从一本书中学习,但我似乎无法找到这个答案。我听说画了一个大的正方形并且顶点有不同的颜色,但我不确定如何做到这一点。

3 个答案:

答案 0 :(得分:25)

在libGDX中,ShapeRenderer对象包含一个drawRect()方法,该方法接受其位置和大小以及四种颜色的参数。这些颜色转换为4角渐变。如果你想要一个垂直渐变,只需使顶角为一种颜色,底角为另一种颜色。像这样:

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

来自ShapeRenderer的API:

  

4种颜色参数指定矩形左下角,右下角,右上角和左上角的颜色,允许您创建渐变。

答案 1 :(得分:8)

似乎在后期libGDX版本中删除了ShapeRenderer.filledRect方法。现在,这样做的方法如下:

shapeRenderer.set(ShapeRenderer.ShapeType.Filled);
shapeRenderer.rect(
        x,
        y,
        width,
        height,
        Color.DARK_GRAY,
        Color.DARK_GRAY,
        Color.LIGHT_GRAY,
        Color.LIGHT_GRAY
);

rect方法的参数与fillRect中的参数一样,就像Kevin Workman的回答一样。

答案 2 :(得分:0)

在进入ShapeRenderer之前,还有一些值得注意的细节。我一个人会坚持伸展和着色Texture

private Color topCol = new Color(0xd0000000);
private Color btmCol = new Color(0xd0000000);

@Override
public void render(float delta) {
    ...
    batch.end(); //Must end your "regular" batch first.
    myRect.setColor(Color.YELLOW);  // Must be called, I don't see yellow, but nice to know.
    myRect.begin(ShapeRenderer.ShapeType.Filled); //Everyone else was saying call `set`.
    //Exception informed me I needed `begin`. Adding `set` after was a NOP.
    myRect.rect(
            10, 400,
            //WORLD_H - 300,  // WORLD_H assumed 1920. But ShapeRenderer uses actual pixels.
            420,
            300,
            btmCol, btmCol, topCol, topCol
    );
    myRect.end();

我希望在玩家健康状况下降时动态改变透明度。 btmColtopCol对透明度没有影响,因此我会坚持Texture。翻译像素空间并不是什么大问题,但这远远超过上面提到的单线或双线。

mid section of my rect, not wanting to show above and below.