显示在每个帧上更改的文本(如分数)

goo*_*ing 7 java android opengl-es

在onDrawFrame方法中,是否有任何简单的方法可以显示简单的白色文本而右上角没有任何纹理,这些纹理会在实现渲染器的类中的每个帧上发生变化?它是二维的,所以没有必要进行任何转换,我相信.我发现了很多教程,但是它们看起来太复杂了,代码太多了.也许只需几行代码即可完成?如果那是不可能的,那么在不修改现有代码的情况下,最简单的方法是什么?因为我是新手,请显示完整的代码.

Gri*_*ace 11

渲染器是一种OpenGL方法.OpenGL ES本身并不支持文本.这留下以下选项:

  1. 使用纹理,使用Android的Canvas类绘制它.
  2. 使用图书馆.这很可能也会吸引到纹理.
  3. 使用多边形创建文本.

既然你的问题是要求一个不能绘制到纹理的解决方案,那么1和2都会出局.既然你想要简单的东西,那么3也是出类拔萃的.没有好的解决方案.

另一种考虑方法是在您正在使用的GLSurfaceView上叠加另一个视图.您可以使用RelativeLayout轻松堆叠两个视图,一个是可以锚定到屏幕右上角的文本视图.下面的伪代码:

<RelativeLayout ... />
    <GLSurfaceView ... />
    <TextView ... />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是可以帮助您摆脱OpenGL的要求来完成您的文本.我在几个应用程序上成功完成了这项工作.


app*_*com 7

您可能需要查看Android SDK示例附带的API Demos项目.有一个OpenGL Sprite Text示例,可以完全满足您的需求.

您可以通过在仿真器(或设备)上安装API演示并导航到:API演示>图形> OpenGL ES> Sprite Text来查看演示

这是一个截图:

在此输入图像描述

屏幕右下角的文本在渲染器的onDrawFrame方法的每个帧上更改.

您可以在Android SDK示例目录中找到源代码: ApiDemos\src\com\example\android\apis\graphics\spritetext

您需要将少量文件复制到项目中,只需很少的代码就可以实现相同的功能.

示例应用程序:我已经创建了一个示例应用程序,通过重用API Demos项目中的代码来演示相同的应用程序.你可以从这里得到它 - OpenGLText_eclipse_project.zip

简而言之,您可以完全重用Grid.java,LabelMaker.java,NumericSprite.java.然后在渲染器中添加几行代码,以使用上面的类,如TextRenderer.java中所示

以下是连续更新得分的看法.

在此输入图像描述

基本上,渲染分数就像这样简单:

LabelMaker mLabels = new LabelMaker();

mLabels.initialize(gl);
mLabels.beginAdding(gl);
int mLabelMsPF = mLabels.add(gl, "Score:", mLabelPaint);
mLabels.endAdding(gl);

mLabels.beginDrawing(gl, mWidth, mHeight);
mLabels.draw(gl, 0, 0, mLabelMsPF);
mLabels.endDrawing(gl);

NumericSprite mNumericSprite = new NumericSprite();
mNumericSprite.setValue(16);
mNumericSprite.draw(gl, 0, 0, mWidth, mHeight);
Run Code Online (Sandbox Code Playgroud)


JRo*_*wan 2

我使用了位图画布drawText,但我仍然必须将其用作纹理,可能具有较小的位图和字体大小

bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
h = (int)((((System.currentTimeMillis()/1000)/60)/60)%60);
    m = (int)(((System.currentTimeMillis()/1000)/60)%60);
    s = (int)((System.currentTimeMillis()/1000)%60);
    paint = new Paint();
    paint.setColor(Color.MAGENTA);
    paint.setTextAlign(Align.CENTER);
    paint.setTypeface(Typeface.DEFAULT_BOLD);
    paint.setTextSize(55);
time = String.valueOf(h) + "h" + String.valueOf(m) + "m" + String.valueOf(s) + "s";
canvas.drawText(time, bitmap.getWidth()/2, 100, paint);
int[] textureIds = new int[1];
    gl.glGenTextures(1, textureIds, 0);
    textureId = textureIds[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
         GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);            
         gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
Run Code Online (Sandbox Code Playgroud)

如果你在第 9 章src/com.badlogic.androidgames.framework.gl.Font.java 是我用于位图字体的,我使用 Codeheads 位图字体生成器生成位图字体