android - 尝试有选择地重绘安卓游戏的背景,但移动图像在屏幕上重复

标签 android opengl-es

如果我只是从展示问题的图片开始,那将是最简单的。这些图片显示了四处移动的纹理的快照。

我的 HTC Hero 上的应用程序:

Image from my Hero

在模拟器上运行良好的相同应用程序(忽略随机放置的剩菜,我知道它们的原因,这不是问题): Image from the emulator

现在,如果您看第一张图片,上面的那个是“真实的”,其他的总是在下面,上面还有副本。我目前只重新绘制访问过的背景方 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/

相关文章:

java - 出现错误 java.lang.NullPointerException : Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

android - import com.google.android.gms.location.LocationClient无法解析

android - Android 中的交互式 3d 模型动画

css - Android Webapp 隐藏滚动条?

java - GoogleSignInResult isSuccess 失败

android - Geofire 正在触发 onGeoQueryReady 而不是 onKeyEntered

android - gl_ReadPixels 怎么可能取决于着色器的复杂性?

iphone - OpenGLES 中缺少的函数的替代列表

android - Android 设备上的 OpenGL ES 2.0 扩展

android - onPause()/onResume() 中的 GLSurface 问题