2015-03-13 35 views
3

這是非常基本的,但我無法弄清楚發生了什麼問題。基本上我試圖圍繞我的一個對象的某個區域繪製一個圓圈。我已經在構造函數中初始化了一個ShapeRenderer(稱爲srDebugCircle),並在render()方法中爲此循環繪製了每個對象。試圖在LibGDX中繪製一個圈子

for (GameObject object : levels.get(LEVEL_INDEX)) { 
     if (object.getType() == ObjectType.SWINGING_SPIKES) { 
      object.draw(batch); 
      srDebugCircle.begin(ShapeType.Filled); 
      srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2); 
      srDebugCircle.setColor(Color.BLACK); 
      srDebugCircle.end(); 
     } 

     if (object.getType() == ObjectType.COIN && (Coin) object).isVisible()) { 
      object.draw(); 
     } 
     ... 
} 

問題是當我添加圓的代碼時,我只看到15個對象中的4個。當我刪除它/評論它一切正常 - 然而,在這兩種情況下,我永遠不會看到一個黑色的實心圓。

我專門談這個部分:

  srDebugCircle.begin(ShapeType.Filled); 
      srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2); 
      srDebugCircle.setColor(Color.BLACK); 
      srDebugCircle.end(); 

任何人都可以明白爲什麼我有這個問題?

+0

我認爲你錯過了引號之間的括號。 (object.getType()== ObjectType.COIN &&「(」(「(Coin)object).isVisible()) – Theyouthis 2015-03-13 15:08:17

+0

您必須在繪製圓之前設置顏色。 – 2015-03-13 15:08:32

回答

2

的問題是,你有兩個Renderer/Batch ES在同一時間運行:
SpriteBatch batchShapeRenderer srDebugCircle
這可能會導致奇怪的行爲。
要解決該問題,請在致電begin()其他人之前致電end()一個Renderer/Batch
在你的情況下,它會是這個樣子:

object.draw(batch); 
batch.end() 
srDebugCircle.begin(ShapeType.Filled); 
srDebugCircle.setColor(Color.BLACK); // Set Color before drawing 
srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2); 
srDebugCircle.end(); 

還要注意,調用一個SpriteBatch電話flush()它應該被稱爲儘可能少end()。因此,使用SpriteBatch繪製所有內容然後繪製所有ShapeRenderer的東西可能是一個好主意。

4

Springrbua的答案的替代方法是繪製使用Pixmaps而不是ShapeRenderer。在SpriteBatch和ShaperRenderer之間切換是一項昂貴的操作,Pixmaps不需要結束SpriteBatch。 Pixmap比ShapeRenderer提供更少的繪製方法,但它確實包括繪製實心圓。

Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888); 
pixmap.setColor(Color.BLACK); 
pixmap.fillCircle(x, y, r); 
Texture texture = new Texture(pixmap); 

// render 
batch.begin(); 
batch.draw(texture, x, y); 
batch.end();