【问题标题】:Drawing a gradient in Libgdx在 Libgdx 中绘制渐变
【发布时间】:2014-01-20 06:38:39
【问题描述】:

好的,我有这个代码

@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 的新手,所以我想从一本书中学习,但我似乎找不到这个答案。我听说过绘制一个大正方形并让顶点具有不同的颜色,但我不确定如何做到这一点。

【问题讨论】:

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


    【解决方案1】:

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

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

    来自 ShapeRenderer 的 API:

    4个颜色参数指定矩形左下角、右下角、右上角和左上角的颜色,让您可以创建渐变。

    【讨论】:

    • 我试过了,背景是黑色的,好像什么都没画一样。我在这里做错了什么? ShapeRenderer shapeRenderer = new ShapeRenderer(); shapeRenderer.begin(ShapeType.Filled); shapeRenderer.rect(0, 0, Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT, Color.BLUE, Color.BLUE, Color.CYAN, Color.CYAN); shapeRenderer.end();
    • 没关系,原来我使用了游戏世界的宽度和高度,而不是相机。傻我。感谢您的帮助!
    • 到今天为止,这已经过时了。
    • @Fran 关心提供更多相关信息吗?更好的是,您可以随时使用更新的解决方案提供您自己的答案。
    • 请注意,在较新版本的 libgdx 中,filledRect() 现在只是 rect()
    【解决方案2】:

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

    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 的回答一样。

    【讨论】:

      【解决方案3】:

      在提交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 对透明度没有影响,因此我会坚持使用 Textures。平移像素空间并不是什么大问题,但这比上面提到的单线或双线要多得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 2012-08-14
        • 1970-01-01
        • 2014-10-22
        • 2021-12-22
        • 2018-09-24
        相关资源
        最近更新 更多