この記事は主にlibgdxのグラフィック描画の使用方法を説明するためのもので、記事ではグラフィック描画の方法と手順について詳しく説明しています。
まず、テクスチャとは何かを英語の説明で理解しましょう。元のフォーマットからデコードされ、GPUにアップロードされたイメージをテクスチャと呼びます。
テクスチャを描画するには、ジオメトリを使用して、ジオメトリの対応する頂点を通してテクスチャを記述することがよくあります。たとえば、長方形を記述するには、各頂点を記述することで長方形を記述できます。
描画するには、まずテクスチャをバインドし、次にジオメトリ記述を OpenGL に渡して描画します。描画のサイズと位置は、ジオメトリ記述と OpenGL のビューポート設定によって決まります。
もちろん、ほとんどのゲームはビューポートをスクリーンと同じサイズにしています。つまり、ピクセルを使うことで、テクスチャを適切なサイズと位置に描画するのが簡単になります。
長方形のジオメトリを描画することはよくありますし、拡散ポップアップのように、同じテクスチャを異なる位置に異なるサイズで配置することもよくあります。しかし、描画のために GPU に各シェイプを毎回渡すのは効率が悪いです。
そのため、同じテクスチャを多数まとめて記述し、まとめてGPUに送り込むことができます。これはSpriteBatchクラスが行っていることです。
SpriteBatch は描画する図形ごとにテクスチャと座標を与えられ、GPU に直接渡すことなく多数の図形を集約します。直接GPUに提出することなく、多くの図形をまとめ、元の図形と異なるテクスチャが与えられた場合、元の図形を維持し、新しい図形を取得します。
前回の記事ではSpriteBatchを使っていましたが、グラフを描画していませんでした。
解像度は2のべき乗でなければなりません。
イメージファイルはassetsフォルダにコピーしてください。
次にコードを修正します。
private Texture texture.
textureをインスタンス化し、texture=new Texture(Gdx.files.internal("image1.jpg")); とした後、assetsフォルダにイメージを置く理由について説明します。 Gdx.filesはlibgdxのファイルモジュールで、主に以下の5つの機能を提供します。
1.ファイルを読む
2.文書作成
3.書類のコピー
4.ドキュメントの移動
5.ドキュメントとディレクトリのリスト
そして、ファイルを操作するためのFileHandleを取得するための4つのメソッドがあります。
1.クラスパス
パスはクラスパスからの相対パスで、ファイルは通常読み取り専用です。
2.内部
内部ファイルパスは、アプリケーションのルートディレクトリまたはandroidのassetsフォルダからの相対パスです。
3.外部
外部ファイルパスはSDカードのルートディレクトリからの相対パスです。
4.絶対
assetsフォルダ自体はリソースを保存するためのフォルダで、resourceフォルダと比べると、その中のリソースはRでIDを生成しないので、イメージを置くのに適しています。
そこで、Gdx.files.internal("image1.jpg")を使ってイメージを取得し、batch.draw(texture,20,10);を呼び出してグラフィックを描画します。
フルコード
package comblogs.htynkn;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class FirstGame implements ApplicationListener {
//描画用SpriteBatch
private SpriteBatch batch;
//テクスチャ
private Texture texture;
@Override
public void create() {
batch = new SpriteBatch(); //インスタンス化
texture=new Texture(Gdx.files.internal("image1.jpg"));
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //画面をクリアする
batch.begin();
batch.draw(texture,20,10);
batch.end();
}
@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
}
効果
イメージを全部表示することはできませんし、実際の操作もイメージの一部で行われたり、イメージファイル内に複数のイメージリソースがコレクションされることもよくあります。
また、イメージの一部を表示するには、TextureRegionクラスを使います。
最も一般的なメソッドは draw(TextureRegion region, float x, float y, float width, float height) です。
初期点と縦横の長さを指定します。
コードを修正します:
package comblogs.htynkn;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class FirstGame implements ApplicationListener {
//描画用SpriteBatch
private SpriteBatch batch;
//テクスチャ
private Texture texture;
//領域
private TextureRegion region;
@Override
public void create() {
batch = new SpriteBatch(); //インスタンス化
texture=new Texture(Gdx.files.internal("image1.jpg"));
region=new TextureRegion(texture, 30,80, 200,200);
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //画面をクリアする
batch.begin();
batch.draw(region,0,0);
batch.end();
}
@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
}
効果
TextureRegionでは力不足かもしれませんが、Spriteを使うこともできます。
SpriteはTextureRegionの機能を含んでいるだけでなく、位置と色を指定することができます。
キーコード
最初のいくつかの例を少し考えてみると、Spriteは実際には上記のコレクションとして機能することがわかります。しかし、Spriteはより便利で、1つのオブジェクトにすべてを記述します。
全コードは以下の通り:
package comblogs.htynkn;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class FirstGame implements ApplicationListener {
//描画用SpriteBatch
private SpriteBatch batch;
//テクスチャ
private Texture texture;
//ウィザード
private Sprite sprite;
@Override
public void create() {
batch = new SpriteBatch(); //インスタンス化
texture=new Texture(Gdx.files.internal("image1.jpg"));
sprite=new Sprite(texture, 80, 80, 400, 300);
sprite.setPosition(10, 10); //位置
sprite.setRotation(15); //回転
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //画面をクリアする
batch.begin();
sprite.draw(batch);
batch.end();
}
@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
}
効果
また、スプライトのsetColorメソッドを使ってグラフィックに色を付けることもできます。
setColor(float r, float g, float b, float a)
ここで、色の表現はすべて0,1の間の数値です。
かきおわる
1.ブレンドについて、デフォルトではブレンドがオンになっています。つまり、グラフィックの半透明部分は、描画される時点ですでにブレンドされています。ブレンドがオフの場合、すでにシーン上にあるものはすべてテクスチャに置き換えられるので、大きな背景を描くのに適しています。
batch.disableBlending();
backgroundSprite.draw(batch); batch.enableBlending();
backgroundSprite.draw(batch); batch.enableBlending();
2、パフォーマンスの最適化について
SpriteBatch にはコンストラクタがあり、バッファの最大数を指定できます。この値が低すぎると余分な GPU 呼び出しが発生し、高すぎるとメモリを使いすぎます。
SpriteBatchにはmaxSpritesInBatchというフィールドがあり、バッファの数を多く設定し、maxSpritesInBatchの値を見て適切なバッファの値を決めることができます。
また、renderCalls というフィールドがあり、その値は、begin から end の間に、end が呼び出されたときにジオメトリステートメントが GPU に供給された回数を示します。
また、バッファのサイズと数を指定するコンストラクタも用意されており、適切に設定することで優れたパフォーマンスを発揮します。