在此之后: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等,没有任何效果。
有什么想法吗? :)
答案 0 :(得分:2)
我终于找到了。
我在进入循环之前添加了一个glTranslatef方法:
gl.glPushMatrix();
gl.glTranslatef(-cameraPosX%32, -cameraPosY%32, 0);
for (int y = 0; y < rows; y++) {
...
首先,我试图使用粗暴的相机波普/ TILE_HEIGHT分部翻译场景失败,但没有成功。
我们必须翻译磁贴延伸到屏幕之外的偏移,而不是整个cameraPosX 偏移,因此我们使用Mod(%)运算符代替分裂。
抱歉我的英语不好^^