在此之後: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