在此之后: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等,没有任何工作。
任何想法? :)
我可能只是使用32x32像素瓷砖添加即时通讯。 – Dullahx 2010-01-31 17:30:52
我发现这一点:http://gpwiki.org/index.php/DirectX:DirectDraw:Tutorials:VB:DX7:Smooth_Scrolling_Tiles却无法实现我的代码逻辑,任何帮助将是巨大的。 – Dullahx 2010-01-31 21:36:33