2010-01-31 5 views
5

Après ceci: Best approach for oldschool 2D zelda-like gameAndroid moteur de carrelage Opengl ES, le défilement lisse

Je suis simple tuiles 2D travail générateur, im la lecture d'une carte int [100] [100] rempli de piocher 1 de ou 0 est soit et tuiles selon leur id de tuile, 0 est l'eau, 1 herbe.

Im en utilisant un certain gestionnaire de contrôle de Numpad de base, en utilisant un camIncr (32.0f), i régler la position de la caméra en fonction du déplacement:

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

Dans ma boucle de tirage, im dessin juste carreaux suffisante pour répondre à mon écran, et suivre la tuile en haut à gauche en utilisant cameraOffsetX et cameraOffsetY (c'est la position de la caméra/taille de la tuile)

Im utilisant un GLU.gluOrtho2D pour ma projection.

Voici la boucle de tirage dans mon moteur de rendu personnalisé:

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

ma fonction tiledBackground de tirage:

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 fonction .draw WaterTile et grassTile dessiner une tuile texture 32x32, pourrait afficher le code le cas échéant. Tout va bien, je peux bouger en utilisant les flèches du pavé numérique, et ma carte "bouge" avec moi, puisque je ne dessine que ce que je peux voir, c'est rapide (voir android OpenGL ES simple Tile generator performance problem où Aleks m'a montré une simple idée de "culling")

Je voudrais que mon moteur défile en douceur maintenant. J'ai essayé de peaufiner la variable camIncr, le GLU.gluOrtho2D etc., rien n'a fonctionné.

Des idées? :)

+0

Je pourrais juste ajouter im utilisant des tuiles de 32x32 px. – Dullahx

+0

j'ai trouvé ceci: http://gpwiki.org/index.php/DirectX:DirectDraw:Tutorials:VB:DX7:Smooth_Scrolling_Tiles mais ne peut pas implémenter cette logique dans mon code, n'importe quelle aide serait grande. – Dullahx

Répondre

2

J'ai finalement découvert.

i ajouté une méthode glTranslatef droit avant d'entrer dans la boucle:

gl.glPushMatrix(); 

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

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

Tout d'abord, je suis en train de traduire, sans succès, la scène en utilisant une brute division cameraPosX/TILE_HEIGHT, ne fonctionnait pas.

Nous devons traduire le décalage par lequel la tuile va au-delà de l'écran, et non pas le total cameraPosX compensé, donc nous utilisons l'opérateur Mod (en%) au lieu de la division.

Désolé pour mon mauvais anglais ^^