2012年10月20日土曜日

glDrawTexiOESを使ってます。

glDrawTexiOES()

こいつがいなければ僕のアプリは50fpsで動いていないでしょう(60fpsも出る)
OpenGLESでは圧倒的な描画速度を誇ります。
なぜ速度に拘るかというと、ゲームをプレイしている時の気持ちよさじゃないでしょうか。

いわゆる「ヌルヌル動く」ってやつです。

iアプリの時は15〜20くらいで作っていたんですが、速度が出るなら出したほうがいいですよね。

ただし、当たり前ですが電池の消費は上がります。
その辺の判断も難しいですよね。

glDrawTexiOES()に話を戻します。
ググってもあんまり情報が出てこないので、初めて使う時は困りました。
なんとか調べまくったり試行錯誤を重ねて、僕はこんな関数を作りました。

public void drawTexture(int index, int x, int y, int width, int height, int defX, int defY, int defWidth, int defHeight) {
    crop[0] = crops[index * 4 + 0] + defX;
    crop[1] = crops[index * 4 + 1] + defY + defHeight;
    crop[2] = defWidth;
    crop[3] = -defHeight;
    texture.set(gl, index);
    ((GL11)gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0);
    ((GL11Ext)gl).glDrawTexiOES(x + scrX, scrY + (scrHeight - height) - y, 0, width, height);
}


drawTexture()の引数
index…使いたいテクスチャの番号(既にメモリに読み込んでいる状態)
x…x座標
y…y座標
width…画像サイズ横幅
height…画像サイズ高さ
defX…テクスチャ内の使いたい部分x座標
defY…テクスチャ内の使いたい部分y座標
defWidth…テクスチャ内の使いたい幅
defHeight…テクスチャ内の使いたい高さ

これで簡単に画像の切り取り、表示ができます。

例えば
グラビティゲートの画像(この場合テクスチャ番号0とする)で説明すると
これの左向き悪魔をx:32,y:64の位置に32*32で表示したい場合
g.drawTexture(0, 32, 64, 32, 32, 16, 0, 16, 16);


半透明にしたい場合は
g.setAlpha(0.5);
g.drawTexture(0, 32, 64, 32, 32, 16, 0, 16, 16);


setAlpha()の中身は
glColor4f()でalpha値を設定しているだけです。

残念なところは回転(rotate)ができないところ
回転は自分で描くのが一番手っ取り早いかも

glDrawTexiOES関しての詳しい内容はググって貰ったほうがいいと思います。


宣伝ですが
Androidアプリ「天上守護門グラビティゲート」配信中です!
無料ですのでダウンロードしてみてください(・∀・ )