2016-08-11 50 views
0

目標什麼是動態更新像素映射的充分方法?

  • 爲了健康酒吧進行瘋狂的速度,同時更新欄的寬度。
  • 在縮放比例(像素與米比例)時保持其質量。

目前我使用libgdx Pixmap創造一個健康的酒吧,但是當我改變drawLine參數,以新的價值,然後突然依然沒有改變。在下面的代碼是我目前的工作代碼,我不確定這是否是動態繪製Pixmap的充分方法。

// This code is working when written all in update method 

Pixmap frame = new Pixmap(32, 3, Pixmap.Format.RGBA8888); 
frame.drawRectangle(...); 
frame.drawLine(...); 

Texture texture = new Texture(frame); 
frame.dispose(); 

batch.begin(); 
batch.draw(texture ...); 
batch.end(); 

樣品healthbar

enter image description here

+0

你在render()中調用它們的全部嗎? –

+0

是的,當我打電話給他們時,它的工作正常,但有沒有辦法全部打電話給他們? – ronscript

+0

首先,您不需要爲此實際創建像素圖。 其次,也許你可以在課堂上創建像素圖字段,但我只是想學習你做的或不是:) 順便說一句,你是在繪製線條和矩形時更改像素圖顏色。 –

回答

4

你不應該使用Pixmap爲(根據經驗,一般的規則:如果你認爲你需要使用像素圖的東西,那麼你很可能錯了) 。 A Pixmap用於加載,存儲或操作CPU內存中的圖像數據:RAM。操縱CPU存儲器中的圖像數據相對較慢,並且所得數據不能用於在屏幕上用例如SpriteBatch

爲此,您需要將數據從CPU內存上傳(複製)到GPU內存:VRAM。 A Texture用於表示VRAM中的圖像數據。所以,的確,你可以通過創建一個Texture來做到這一點。或者,您可以通過調用texture.load(pixmap)方法來重新使用現有的紋理。但是,將圖像數據從RAM上傳到VRAM也相對較慢。

因此,您最好直接使用GPU來實現您想要的效果,而不是在CPU上操作圖像數據然後將其複製到GPU上。您沒有提供有關您實際想要達到的內容的足夠信息,但以下是一些可幫助您開始使用的選項。

  1. 只畫出完整欄的一部分。假設您的地圖集中有一張代表完整健康欄的圖像,並且您只想渲染其中的一部分,代表實際健康狀況:batch.draw(region.getTexture(), x, y, width * health, height, region.getU(), region.getV(), region.getU() + health * (region.getU2() - region.getU()), region.getV2());(此處爲x,y,widthheight是您的酒吧的位置和大小世界座標和health是範圍從0到1的歸一化健康)。
  2. 按比例將TextureRegion設置爲酒吧的大小。假設您的健康狀況欄完全不透明或僅與外部線條一致,則可以使用單個像素TextureRegion並將其縮放爲您想要的尺寸:barch.draw(region, x, y, width * health, height);
  3. 使用nine-patch
  4. 使用ShapeRenderer,它提供了與Pixmap幾乎相同和更多的繪圖功能,但直接使用GPU。
+0

哪一個你最推薦最具表現力? – ronscript

+1

這取決於你的其他代碼。如果你已經在使用'ShapeRenderer',那麼你也可以使用它。然而,如果你使用'SpriteBatch',那麼通常會增加一個(單個像素)'TextureRegion'的性能會更好(注意你可以使用一個白色像素,因爲你可以用SpriteBatch將它着色爲你想要的任何顏色)。無論哪種方式,它可能永遠不會是一個明顯的性能差異。 – Xoppa

+0

目前我使用的是ECS框架,並且已經創建了一個多功能的系統,所以我可以使用您所做的任何選擇,而且我的遊戲藝術設計也是由像素藝術組成的。哪一個適合我的遊戲最適合? – ronscript

相關問題