2014-04-06 68 views
2

我试图创建一个“进度条”的排序,但剪辑似乎并没有按照我期望的方式工作。这是我做错了什么或者我误解了吗?libgdx ScissorStack不按预期工作

draw()的常规应剪辑:

ClipTest group类, TestScreen和屏幕截图
@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(); 
     } 
    } 
} 

完整的样本代码。

enter image description here

  • ClipTest是用于演示 “错误” 组的一个子类。
  • ClipImage是Image的子类,它在draw()上执行剪切。
  • ClipTest有2个图像,背景和前景。

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

前景是白色的图像,它的宽度取决于条的百分比。

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

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

任何想法有什么不对?

+0

我知道你说的“种类”,所以它可能不是你所需要的,但以防万一你不知道它 - 如果你得到夜间释放,那么有一个进度条http://libgdx.badlogicgames .com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/ui/ProgressBar.html – Chase

+0

@Chase:我真的很想这么做,但它也因为所有其他语法更改而破坏了我的项目阶段的构造器被改变了,等等)。我希望这将是一个小疏忽,结果是 – twig

+0

你应该问这个http://gamedev.stackexchange.com而不是 – ashes999

回答

5

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

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

因为draw呼叫可能导致冲洗的情况发生,你需要保持活跃,剪刀区域内draw电话。您可能还需要在启动活动剪刀区域之前清洗或结束批次,以防止在剪刀开始刷入活动剪刀区域之前排队的绘制调用。

+1

是的!现在已经3天了,谢谢你恢复我的理智!这个建议非常完美,并使我走上了正确的道路。对于那些想知道的,我必须在draw()覆盖开始时调用batch.flush(),以确保在继续剪切之前,所有内容都按预期绘制出来。 super之后需要调用batch.flush()。draw()以确保正确的内容被剪切。 – twig

+1

@ P.T。启用剪刀之前冲洗为我做了诀窍。顺便说一句,我已经更新了链接,并更新了原始维基与您的答案摘录。 –