2010-01-31 18 views
5

Después de esto: Best approach for oldschool 2D zelda-like gameAndroid OpenGL ES, desplazamiento suave

Tengo una azulejos 2D sencillo generador de trabajo, im la lectura de un mapa int [100] [100] rellena de 1 de o 0 y sacar las baldosas de acuerdo con la su ID de azulejo, 0 es agua, 1 hierba.

Im utilizando algún manejador de base de control de teclado numérico, utilizando un camIncr (32.0f), i cambia la posición de la cámara en función del movimiento:

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

En mi bucle de tracción, soy sólo dibujo suficientes fichas para encajar en mi pantalla, y rastrear el mosaico superior izquierdo usando cameraOffsetX y cameraOffsetY (es la posición de la cámara/tamaño del mosaico)

Estoy usando un GLU.gluOrtho2D para mi proyección.

Aquí es el bucle de tracción dentro de mi intérprete personalizado:

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); 

mi función tiledBackground sorteo:

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

} 

la función WaterTile y grassTile .draw dibujar una baldosa de 32x32 textura, puede enviar el código si es relevante.

Todo está bien, puedo moverme usando las flechas del teclado numérico, y mi mapa 'se mueve' conmigo, ya que estoy dibujando lo que puedo ver, es rápido (ver android OpenGL ES simple Tile generator performance problem donde Aleks me señaló una simple idea de 'descarte')

Me gustaría que mi motor 'scroll suave' ahora. Intenté ajustar la variable camIncr, GLU.gluOrtho2D, etc., nada funcionó.

¿Alguna idea? :)

+0

Podría simplemente agregar im usando 32x32 píxeles. – Dullahx

+0

encontré esto: http://gpwiki.org/index.php/DirectX:DirectDraw:Tutorials:VB:DX7:Smooth_Scrolling_Tiles pero no puedo implementar esa lógica en mi código, cualquier ayuda sería genial. – Dullahx

Respuesta

2

Finalmente me enteré.

añadí un método glTranslatef justo antes de entrar en el bucle:

gl.glPushMatrix(); 

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

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

En primer lugar, yo estaba tratando, sin éxito, para traducir la escena utilizando una división cameraPosX/TILE_HEIGHT bruta, no funcionó.

tenemos que traducir el desplazamiento por el cual el azulejo se extiende más allá de la pantalla, no el total de cameraPosX desplazamiento, por lo que estamos utilizando el (%) operador Mod en lugar de la división.

Lo siento por mi inglés malo ^^