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

Dul*_*ahx 5 android opengl-es

接下来:针对oldschool 2D塞尔达式游戏的最佳方法

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

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

 case KeyEvent.KEYCODE_DPAD_RIGHT:
 cameraPosX = (float)(cameraPosX + camIncr);
 break;
Run Code Online (Sandbox Code Playgroud)

在我的绘制循环中,我只是绘制足够的瓷砖以适合我的屏幕,并使用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);
Run Code Online (Sandbox Code Playgroud)

我的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();

 }
Run Code Online (Sandbox Code Playgroud)

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

一切都很好,我可以使用小键盘箭头移动,我的地图'移动'跟我一起,因为我只画了我能看到的东西,它快速(参见android OpenGL ES简单的Tile生成器性能问题,其中Aleks指向我一个简单的'剔除'想法)

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

有任何想法吗 ?:)

Dul*_*ahx 2

我终于发现了。

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

gl.glPushMatrix();

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

    for (int y = 0; y < rows; y++) {
        ...
Run Code Online (Sandbox Code Playgroud)

首先,我尝试使用粗暴的cameraPosX / TILE_HEIGHT划分来翻译场景,但没有成功,没有成功。

我们必须平移图块超出屏幕的偏移量,而不是总的cameraPosX偏移量,因此我们使用Mod (%)运算符而不是除法。

抱歉我的英语不好^^