Java libgdx剪刀堆栈未按预期工作

Java libgdx剪刀堆栈未按预期工作,java,libgdx,clipping,Java,Libgdx,Clipping,我试图创建一个“进度条”,但剪辑似乎并没有按照我预期的方式工作。这是我做错了什么还是我误解了什么 应该剪辑的draw()例程: @Override public void draw(SpriteBatch batch, float parentAlpha) { Rectangle scissors = new Rectangle(); Rectangle clipBounds = new Rectangle(getX(), getY(), getW

我试图创建一个“进度条”,但剪辑似乎并没有按照我预期的方式工作。这是我做错了什么还是我误解了什么

应该剪辑的
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
    是用于演示“bug”的组的子类
  • ClipImage
    是Image的一个子类,它在
    draw()
    上执行剪裁
  • ClipTest
    有两个图像,背景和前景
背景是黑色图像,它应该始终是进度条的完整大小

前景是白色图像,其宽度根据条的百分比进行剪裁

我发现一个奇怪的结果是,尽管前景使用了clipping类,但背景图像实际上是被剪裁的

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


你知道怎么回事吗?

在批处理“刷新”之前,实际绘图不会发生,这不是你需要包装的
draw
调用,因为这只是排队等待以后完成绘图

您需要确保OpenGL draw调用发生在启用和禁用剪刀之间,因此在
draw
之后添加
刷新。看见


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

我知道您说过“排序”因此,这可能不是你需要的,但只是以防万一,你不知道它-如果你得到一个夜间发布,那么有一个进度条@Chase:我真的很想这样做,但它也破坏了我的项目,因为所有其他语法更改(stage的构造函数被更改,等等)。我希望这是一个小小的疏忽,结果是你应该反问这个问题是的!!!已经三天了,谢谢你让我恢复理智!这个建议非常完美,指引我走上正确的道路。对于那些想知道的人,我必须在draw()覆盖开始时调用batch.flush(),以确保在继续剪切之前,所有内容都按预期进行了绘制。在super.draw()之后需要再次调用batch.flush(),以确保剪切了正确的内容。@P.T.启用剪刀之前的flush帮了我一把。顺便说一句,我已经更新了链接,也用你答案的摘录更新了原始维基。