2016-08-11 4 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

まず、この目的のために実際にpixmapを作成する必要はありません。 第二に、クラスでpixmapフィールドを作成することができますが、私はちょうどあなたがしたかどうかを欲しかった:) ところで、線と四角形を描いている間にpixmapの色を変更していますか? –

答えて

4
あなたはそのための Pixmapを使用すべきではない

(親指の一般的なルールとして:あなたは、あなたが間違っている可能性のある何かのためにピックスマップを使用する必要があると考えられる場合) 。 Pixmapは、CPUメモリ:RAMに画像データをロード、ストア、または操作するために使用されます。 CPUメモリ内の画像データを操作することは比較的遅く、その結果得られるデータは例えばスクリーン上でのレンダリングに使用することができない。 SpriteBatch

そのためには、CPUメモリからGPUメモリにデータをアップロード(コピー)する必要があります:VRAM。 Textureは、VRAMの画像データを表現するために使用されます。だから、実際にはTextureを作成することでそれを行うことができます。あるいは、texture.load(pixmap)メソッドを呼び出して既存のテクスチャを再利用することもできます。しかし、RAMからVRAMへの画像データのアップロードも比較的遅い。

CPU上の画像データを操作してGPUにコピーするのではなく、GPUを直接使用して自分が望むものを実現する方がよいでしょう。あなたが実際に達成したいことに関する十分な情報を提供していないが、ここでは始めるのに役立ついくつかのオプションがある。

  1. フルバーの一部だけを描画します。あなたのアトラスにフル・ヘルス・バーを表すイメージがあり、実際の健康状態を表す、その一部だけをレンダリングしたいとします。batch.draw(region.getTexture(), x, y, width * health, height, region.getU(), region.getV(), region.getU() + health * (region.getU2() - region.getU()), region.getV2());(ここではxy、およびheightはあなたのバーの位置とサイズですhealthは0から1までの正規化された健康状態です)。
  2. バーのサイズにTextureRegionをスケールします。健康バーが完全に不透明であるか外線のみであるとしたら、1つのピクセルTextureRegionを使用して、それを必要なサイズに調整できます。barch.draw(region, x, y, width * health, height);
  3. nine-patchを使用します。
  4. 実際にはPixmapと同じでより多くの描画機能を提供しますが、代わりにGPUを直接使用します。ShapeRendererを使用してください。
+0

どちらをお勧めしますか? – ronscript

+1

これはあなたの他のコードによって異なります。とにかく 'ShapeRenderer'を既に使っているのであれば、これも同様に使うことができます。しかし、SpriteBatchを使用する場合は、通常、(単一ピクセル)TextureRegionをストレッチする方が優れています(SpriteBatchで任意の色に色付けできるため、単一の白いピクセルを使用できます)。いずれにしても、それはおそらく顕著なパフォーマンスの差になることはありません。 – Xoppa

+0

現在、私はECSフレームワークを使用しており、多彩なシステムを作成しているので、あなたが選んだ選択肢を使うことができますし、ゲームアートのデザインはピクセルアートでできています。私のゲームにはどれが最適ですか? – ronscript

関連する問題