2010-01-31 46 views
5

在此之后:Best approach for oldschool 2D zelda-like game的Android OpenGL ES的平铺发动机,平滑滚动

我有一个简单的2D区块发电机工作,即时通讯根据读取int地图[100] [100]填充以1或0和绘制瓦片他们的瓷砖ID,0是水,1草。

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

在我的平局循环,我只是画足够的瓷砖,以适应:

即时通讯使用一些基本的数字键盘控制处理器,采用了camIncr(32.0f),我根据运动设置的摄像机位置我的屏幕,并使用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); 

我tiledBackground绘制函数:

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等,没有任何工作。

任何想法? :)

+0

我可能只是使用32x32像素瓷砖添加即时通讯。 – Dullahx 2010-01-31 17:30:52

+0

我发现这一点:http://gpwiki.org/index.php/DirectX:DirectDraw:Tutorials:VB:DX7:Smooth_Scrolling_Tiles却无法实现我的代码逻辑,任何帮助将是巨大的。 – Dullahx 2010-01-31 21:36:33

回答

2

我终于找到了。

我右键进入循环前添加一个方法的glTranslatef:

gl.glPushMatrix(); 

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

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

首先,我是失败尝试翻译使用蛮力cameraPosX/TILE_HEIGHT师现场,没有工作。

我们有翻译的偏移由瓷砖超出屏幕,而不是总cameraPosX 偏移,所以我们使用国防部(%)运营商,而不是分裂。

对不起,我的英语不好^^