2014-04-06 67 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。啓用剪刀之前沖洗爲我做了訣竅。順便說一句,我已經更新了鏈接,並更新了原始維基與您的答案摘錄。 –