如果我只是从展示问题的图片开始,那将是最简单的。这些图片显示了四处移动的纹理的快照。
我的 HTC Hero 上的应用程序:
在模拟器上运行良好的相同应用程序(忽略随机放置的剩菜,我知道它们的原因,这不是问题):
现在,如果您看第一张图片,上面的那个是“真实的”,其他的总是在下面,上面还有副本。我目前只重新绘制访问过的背景方 block ,并且出于某种原因将它们绘制在副本上方(您可以看到它们都被瓷砖部分绘制)。
在 Android 手机上,您是否必须始终在每一帧都重新绘制整个屏幕?或者是否有可能摆脱这些奇怪的副本?
这是用于绘制纹理的代码(我是 opengl-es 的新手,所以它很像复制岛):
首先
public static void beginDrawing(GL10 gl, float viewWidth, float viewHeight) {
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glOrthof(0.0f, viewWidth, 0.0f, viewHeight, 0.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glEnable(GL10.GL_TEXTURE_2D);
}
然后对于每个纹理(我先绘制背景,然后在这种情况下只绘制一个绿巨人纹理。我确定它只被绘制一次):
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
((GL11Ext) gl).glDrawTexfOES(x, y, 0, (float) mWidth, (float) mHeight);
最后:
public static void endDrawing(GL10 gl) {
gl.glDisable(GL10.GL_BLEND);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
}
我用来加载纹理的代码:
private void loadGLTextures(GL10 gl) {
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
textureID = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
int[] mCropWorkspace = new int[4];
mCropWorkspace[0] = 0;
mCropWorkspace[1] = bitmap.getHeight();
mCropWorkspace[2] = bitmap.getWidth();
mCropWorkspace[3] = -bitmap.getHeight();
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,
GL11Ext.GL_TEXTURE_CROP_RECT_OES,
mCropWorkspace,
0);
mCrop = mCropWorkspace;
bitmap.recycle();
}
非常感谢所有帮助,如果有任何不清楚的地方,请发表评论!
编辑:我应该补充一点,如果我每一帧都重绘所有方 block ,“额外”图像将被隐藏,并且它会按应有的方式工作。
最佳答案
Do you have to always repaint the whole screen every frame on the android phones?
是的,这就是使用双缓冲的原因。 在显示当前帧的同时准备下一帧。
关于android - 尝试有选择地重绘安卓游戏的背景,但移动图像在屏幕上重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606321/