libgdx ScissorStack没有按预期工作

时间:2014-04-06 03:58:20

标签: java libgdx clipping

我正试图创建一个"进度条"各种各样,但裁剪似乎并没有像我期望的那样发挥作用。这是我做错了什么还是我误解了什么?

应剪辑的draw()例程:

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        Rectangle scissors = new Rectangle();
        Rectangle clipBounds = new Rectangle(getX(), getY(), getWidth() * 0.75f, getHeight());

        ScissorStack.calculateScissors(
                getStage().getCamera(),
                getStage().getGutterWidth(),
                getStage().getGutterHeight(),
                getStage().getCamera().viewportWidth,
                getStage().getCamera().viewportHeight,
                batch.getTransformMatrix(),
                clipBounds, scissors);

        if (ScissorStack.pushScissors(scissors)) {
            super.draw(batch, parentAlpha);
            ScissorStack.popScissors();
        }
    }
}

完成ClipTest group课程,TestScreen和屏幕截图的示例代码。

enter image description here

  • ClipTest是用于演示" bug"的组的子类。
  • ClipImage是Image的子类,它在draw()上执行剪辑。
  • ClipTest有2张图片,背景和前景。

背景是黑色图像,它应该始终是进度条的完整大小。

前景是白色图像,根据条形图的百分比剪裁宽度。

我发现的奇怪结果是,虽然前景正在使用剪辑类,但背景图像实际上是剪裁的。

预期的结果是使用photoshop创建的(因为我无法通过代码生成它)。

知道什么是错的吗?

1 个答案:

答案 0 :(得分:5)

实际绘图直到批处理“刷新”才会发生,而不是你需要包装的draw调用,因为它只是将绘图排队等待以后完成。

您需要确保在启用和禁用剪刀之间进行OpenGL绘图调用,因此在flush之后添加draw。看到 https://github.com/libgdx/libgdx/wiki/Clipping,-with-the-use-of-scissorstack

由于draw调用可能导致刷新,您需要将draw调用保留在active-scissor区域内。您可能还需要在启动活动剪刀区域之前刷新或结束批处理,以防止在剪刀开始在活动剪刀区域内刷新之前排队的绘制调用。