2010-01-31 14 views
5

A seguito di questo: Best approach for oldschool 2D zelda-like gameAndroid OpenGL ES, scorrimento continuo

ho avuto un semplice piastrelle 2D generatore di lavoro, im lettura di una mappa int [100] [100] riempita di 1 del o 0 di e disegnare le piastrelle in base alle il loro id di piastrella, 0 è acqua, 1 erba.

Im usando un po 'di gestore di controllo di base tastierino numerico, utilizzando un camIncr (32.0f), ho impostato la posizione della fotocamera in base al movimento:

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

Nel mio ciclo pareggio, im solo disegno abbastanza piastrelle per adattarsi su il mio schermo e traccia il riquadro in alto a sinistra usando cameraOffsetX e cameraOffsetY (la posizione della telecamera/dimensione della piastrella)

Im usando un GLU.gluOrtho2D per la mia proiezione.

Ecco il ciclo sorteggio all'interno del mio renderer personalizzato:

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

mia funzione tiledBackground pareggio:

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 funzione waterTile e grassTile .draw disegnare una piastrella 32x32 strutturato, potrebbe inviare il codice se rilevante.

Tutto va bene, posso spostare usando le frecce del tastierino numerico, e la mia mappa 'si muove' con me, dal momento che im solo disegnare quello che posso vedere, la sua veloce (vedi android OpenGL ES simple Tile generator performance problem dove Aleks mi ha segnalato un semplice 'abbattimento' idea)

Mi piacerebbe che il mio motore "scorre liscio" ora. Ho provato a modificare la variabile camIncr, il GLU.gluOrtho2D ecc., Niente ha funzionato.

Qualche idea? :)

+0

Potrei semplicemente aggiungere im usando piastrelle 32x32 px. – Dullahx

+0

ho trovato questo: http://gpwiki.org/index.php/DirectX:DirectDraw:Tutorials:VB:DX7:Smooth_Scrolling_Tiles ma non posso implementare quella logica nel mio codice, qualsiasi aiuto sarebbe fantastico. – Dullahx

risposta

2

Ho finalmente scoperto.

ho aggiunto un metodo glTranslatef destra prima di entrare nel ciclo:

gl.glPushMatrix(); 

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

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

, ero senza successo cercando di tradurre la scena usando una bruta divisione cameraPosX/TILE_HEIGHT, non ha funzionato.

dobbiamo tradurre il compensato con cui la piastrella estende oltre lo schermo, non sul totale cameraPosX compensare, quindi stiamo usando l'operatore MOD (%) invece di divisione.

Ci scusiamo per il mio cattivo inglese ^^