Android Opengl ES平铺引擎,流畅滚动

时间:2010-01-31 12:06:25

标签: android opengl-es

在此之后:Best approach for oldschool 2D zelda-like game

我有一个简单的2D瓷砖生成器工作,我正在读取填充了1或0的int地图[100] [100]并根据他们的瓷砖ID绘制瓷砖,0是水,1草。

我使用一些基本的Numpad控制处理程序,使用camIncr(32.0f),我根据运动设置摄像机位置:

 case KeyEvent.KEYCODE_DPAD_RIGHT:
 cameraPosX = (float)(cameraPosX + camIncr);
 break;

在我的绘制循环中,我只是绘制足够的瓷砖以适合我的屏幕,并使用cameraOffsetX和cameraOffsetY(它的相机位置/瓷砖大小)跟踪左上方的瓷砖

我使用GLU.gluOrtho2D进行投影。

以下是我的自定义渲染器中的绘制循环:

 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  gl.glMatrixMode( GL10.GL_PROJECTION );
  gl.glLoadIdentity( );
  GLU.gluOrtho2D(gl, 0, scrWidth, scrHeight, 0);
  repere.draw(gl, 100.0f); // this is just a helper, draw 2 lines at the origin

  //Call the drawing methods
  gl.glMatrixMode(GL10.GL_MODELVIEW);
  gl.glLoadIdentity();

  tiledBackground.draw(gl, filtering);

我的tilesBackground绘图功能:

  int cols = (569 / 32) + 2;      // how many columns can fit on the screen 
  int rows = (320 / 32) + 1;     // haw many rows can fit on the screen 

  int cameraPosX = (int) Open2DRenderer.getCameraPosX();
  int cameraPosY = (int) Open2DRenderer.getCameraPosY();

  tileOffsetX = (int) (cameraPosX / 32);
  tileOffsetY = (int) (cameraPosY / -32);

  gl.glPushMatrix();

  for (int y = 0; y < rows; y++) {
   for (int x = 0; x < cols; x++) {

    try {
     tile = map[y + tileOffsetY][x + tileOffsetX];
    } catch (Exception e) {
     e.printStackTrace(); //when out of array
     tile = 0;
    }

    gl.glPushMatrix();

    if (tile==0){
     waterTile.draw(gl, filter);
     }

    if (tile==4) {
     grassTile.draw(gl, filter);
     }

    gl.glTranslatef(32.0f, 0.0f, 0.0f);

   }//


   gl.glPopMatrix();
   gl.glTranslatef(0.0f, 32.0f, 0.0f);

  }

  gl.glPopMatrix();

 }

waterTile和grassTile .draw函数绘制一个32x32纹理贴图,如果相关可能会发布代码。

一切都很好,我可以使用小键盘箭头移动,我的地图'移动'跟我一起,因为我只画了我能看到的东西,速度很快(见android OpenGL ES simple Tile generator performance problem Aleks指向我简单的'剔除'想法)

我希望我的引擎能够“平滑滚动”。我已经尝试调整camIncr变量,GLU.gluOrtho2D等,没有任何效果。

有什么想法吗? :)

1 个答案:

答案 0 :(得分:2)

我终于找到了。

我在进入循环之前添加了一个glTranslatef方法:

gl.glPushMatrix();

    gl.glTranslatef(-cameraPosX%32, -cameraPosY%32, 0);

    for (int y = 0; y < rows; y++) {
        ...

首先,我试图使用粗暴的相机波普/ TILE_HEIGHT分部翻译场景失败,但没有成功。

我们必须翻译磁贴延伸到屏幕之外的偏移,而不是整个cameraPosX 偏移,因此我们使用Mod(%)运算符代替分裂。

抱歉我的英语不好^^