libgdx ScissorStack 未按预期工作

Posted

技术标签:

【中文标题】libgdx ScissorStack 未按预期工作【英文标题】:libgdx ScissorStack not working as expected 【发布时间】:2014-05-18 08:42:11 【问题描述】:

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

应该剪辑的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 和屏幕截图的完整示例代码。

ClipTest 是 group 的子类,用于演示“bug”。 ClipImage 是 Image 的子类,对 draw() 进行裁剪。 ClipTest 有 2 张图片,背景和前景。

背景是黑色图像,它应该始终是进度条的全尺寸。

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

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

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

知道有什么问题吗?

【问题讨论】:

我知道你说的是“各种各样”,所以它可能不是你需要的,但以防万一你不知道 - 如果你得到一个夜间版本,那么会有一个进度条 @987654323 @ @Chase:我真的很想这样做,但它也破坏了我的项目,因为所有其他语法更改(舞台的构造函数已更改等)。我希望这只是一个小小的疏忽,结果却是 你应该在gamedev.stackexchange.com 上问这个问题 【参考方案1】:

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

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

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

【讨论】:

是的!现在已经3天了,谢谢你恢复了我的理智!这个建议很完美,让我走上了正确的道路。对于那些想知道的人,我必须在我的 draw() 覆盖开始时调用 batch.flush() 以确保在继续剪辑之前按预期绘制所有内容。在 super.draw() 之后需要再次调用 batch.flush() 以确保正确的内容被截断。 @P.T.在启用剪刀之前冲洗对我有用。顺便说一句,我已经更新了链接,并用你的答案摘录更新了原始 wiki。

以上是关于libgdx ScissorStack 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Specflow 场景大纲未按预期工作

Angular ngOnit () 未按预期工作

viewDidLoad 未按预期运行

PostAsJsonAsync 未按预期运行

$() 函数未按预期工作

UIStackView 未按预期显示