画像を描画する独自の方法があります。Vertex と UVBuffer を使用します。
次のように描きます。
SpriteBatch.Begin(blendMode) <- sets up blending
SpriteBatch.Draw(parameters) <- add vertices to the list of vertex arrays
SpriteBatch.End() <- Sets up buffers and draw out everything at once
そして、それは魅力のように機能します。
ただし、同じ Draw メソッドを使用する DrawString メソッドを試してみると。テクスチャ UV マップまたは一部のバッファが台無しになります (すべてが、ピクセルが欠落した塗りつぶされた長方形のように描画されます)。
Angelcode Bitmap Font Generator を使用しています。
同じ機能を使用しますが、唯一の違いは、現在のキャラクターのデータに従ってテクスチャと UV マップを設定することです。
他の関数で何かを台無しにした場合に備えて、すべての Draw 関数を投稿します。
public void Begin(int Source, int Destination)
{
GL.glEnable(GL10.GL_BLEND);
GL.glBlendFunc(Source, Destination);
}
すべてのバッファと変数 (関数で宣言したくなかった)
ArrayList<float[]> vertices = new ArrayList<float[]>();
FloatBuffer vertexBuffer;
ArrayList<short[]> indices = new ArrayList<short[]>();
ShortBuffer indexBuffer;
float minU = 0;
float maxU = 1;
float minV = 0;
float maxV = 1;
ArrayList<GLColor> colors = new ArrayList<GLColor>();
GLColor c_color;
ArrayList<float[]> vertexUVs = new ArrayList<float[]>();
FloatBuffer uvBuffer;
ArrayList<TransformationMatrix> matrices = new ArrayList<TransformationMatrix>();
TransformationMatrix matrix = new TransformationMatrix();
ArrayList<Integer> textures = new ArrayList<Integer>();
DrawString から main メソッドにアクセスする Draw メソッド
public void Draw(Texture2D texture, Rectangle destination, Rectangle source, GLColor color)
{
Draw(texture, destination, source, color, new Vector2(0, 0), 0);
}
Draw メソッド
public void Draw(Texture2D texture, Rectangle destination, Rectangle source, GLColor color, Vector2 origin, float Rotation)
{
vertices.add(new float[]{-origin.X, -origin.Y,
destination.Width - origin.X, -origin.Y,
destination.Width - origin.X, destination.Height - origin.Y,
-origin.X, destination.Height - origin.Y});
indices.add(new short[]{0, 1, 2, 2, 3, 0});
//Generate UV of Vertices
minU = 0;
maxU = 1;
minV = 0;
maxV = 1;
if (source != null)
{
minU = (float)source.X / (float)texture.getWidth();
maxU = (float)(source.X + source.Width) / (float)texture.getWidth();
minV = (float)source.Y / (float)texture.getHeight();
maxV = (float)(source.Y + source.Height) / (float)texture.getHeight();
}
vertexUVs.add(new float[]{minU, minV,
maxU, minV,
maxU, maxV,
minU, maxV});
//Calculate Matrix
matrix = new TransformationMatrix();
matrix.Translate(destination.X + origin.X, destination.Y + origin.Y, 0);
matrix.Rotate(0, 0, Rotation);
matrices.add(matrix);
colors.add(color);
textures.add(texture.ID);
}
Draw String メソッド (バグの原因)
public void DrawString(SpriteFont spriteFont, String Text, Vector2 vector, GLColor color)
{
int cursorX = (int)vector.X;
int cursorY = (int)vector.Y;
for (int i = 0; i < Text.length(); i++)
{
char c = Text.charAt(i);
if (c == '\n') cursorX += spriteFont.LineHeight;
else
{
int index = (int)c;
//Draw Character
if (spriteFont.Characters.length <= index)
{
Log.d("SpriteFont error", "Character is not presented in SpriteFont!");
continue;
}
CharacterDescriptor cd = spriteFont.Characters[index];
Rectangle source = new Rectangle(cd.x, cd.y, cd.Width, cd.Height);
//Draw Character
Rectangle destination = new Rectangle(cursorX + cd.XOffset, cursorY + cd.YOffset, cd.Width, cd.Height);
Draw(spriteFont.Pages[cd.Page], destination, source, color);
cursorX += cd.XAdvance;
}
}
}
そして最後に終了方法:
public void End()
{
vertexBuffer = ByteBuffer.allocateDirect(vertices.size() * 8 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
for (int i = 0; i < vertices.size(); i++)
{
vertexBuffer.put(vertices.get(i));
}
vertexBuffer.flip();
//Generate Indices
indexBuffer = ByteBuffer.allocateDirect(indices.size() * 6 * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
for (int i = 0; i < vertices.size(); i++)
{
indexBuffer.put(indices.get(i));
}
indexBuffer.flip();
//Generate UV of Vertices
uvBuffer = ByteBuffer.allocateDirect(vertexUVs.size() * 8 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
for (int i = 0; i < vertexUVs.size(); i++)
{
uvBuffer.put(vertexUVs.get(i));
}
uvBuffer.flip();
//Bind Vertices
for (int i = 0; i < colors.size(); i++)
{
//Bind Pointers
GL.glEnableClientState(GL10.GL_VERTEX_ARRAY);
GL.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
GL.glEnable(GL10.GL_TEXTURE_2D);
vertexBuffer.position(i * 8);
GL.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
uvBuffer.position(i * 8);
GL.glTexCoordPointer(2, GL10.GL_FLOAT, 0, uvBuffer);
matrix = matrices.get(i);
c_color = colors.get(i);
GL.glMatrixMode(GL10.GL_MODELVIEW);
GL.glLoadIdentity();
GL.glTranslatef(matrix.TranslationX, matrix.TranslationY, matrix.TranslationZ);
GL.glRotatef((float)Math.sqrt(matrix.RotationX * matrix.RotationX + matrix.RotationY*matrix.RotationY + matrix.RotationZ*matrix.RotationZ), matrix.RotationX, matrix.RotationY, matrix.RotationZ);
//Bind Texture
GL.glBindTexture(GL10.GL_TEXTURE_2D, textures.get(i));
GL.glColor4f(c_color.R, c_color.G, c_color.B, c_color.A);
//Draw Elements
GL.glDrawElements(GL10.GL_TRIANGLES, 8, GL10.GL_UNSIGNED_SHORT, indexBuffer);
GL.glBindTexture(GL10.GL_TEXTURE_2D, 0);
GL.glDisable(GL10.GL_TEXTURE_2D);
GL.glDisableClientState(GL10.GL_VERTEX_ARRAY);
GL.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
//Disable things
GL.glDisable(GL10.GL_BLEND);
colors.clear();
matrices.clear();
vertices.clear();
vertexUVs.clear();
}
私はまだ解決策を見つけようとしています。また、この問題を理解するのに役立つ画像を投稿しようとします。前もって感謝します。