Bonjour !
Je suis en train d'apprendre OpenGL et j'essaye de porter un programme depuis SDL. Il s'agit d'un bête tile engine, je pourrai alors remplacer les tiles par des cubes pour faire quelques beau effets...
Les difficultés que j'ai en ce moment viennent des trop nombreux choix qui s'offre pour re implémenter ce moteur avec OpenGL, n'ayant pas le recule nécessaire pour apprécier si telle ou telle solution sera efficace ou peu maintenable dans le future.
Je remplace logiquement mes tiles (SDL_Surface, seul ou dans une structure tile) par un carré (vertex avec GL_QUADS)
- En y reflechissant, il serai aussi possible d'utiliser GL_QUAD_STRIP ?
- Au niveau du positionnement des carrées (actuellement j'utilise GL_QUADS)
j'ai d'abord simplement multiplié chaque coord par la position du tile.
Mais j'ai par la suite pensé après avoir commencé a lire le guide que je pourrai utiliser des translations comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void square_draw(int x, int y) { glBegin(GL_QUADS); glVertex2i(x * TILE_SIZE + TILE_SIZE, y * TILE_SIZE + TILE_SIZE); // Bottom left glVertex2i(x * TILE_SIZE, y * TILE_SIZE + TILE_SIZE); // Botton right glVertex2i(x * TILE_SIZE, y * TILE_SIZE); // Top right glVertex2i(x * TILE_SIZE + TILE_SIZE, y * TILE_SIZE); // Top left glEnd(); }
Que penser de ces solutions (les deux marchent) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void square_draw(int x, int y) { glPushMatrix(); glTranslated(x * TILE_SIZE - 32, 480 - y * TILE_SIZE - 64, 0); glBegin(GL_QUADS); glVertex2i(TILE_SIZE + TILE_SIZE, TILE_SIZE + TILE_SIZE); // Bottom left glVertex2i(TILE_SIZE, TILE_SIZE + TILE_SIZE); // Botton right glVertex2i(TILE_SIZE, TILE_SIZE); // Top right glVertex2i(TILE_SIZE + TILE_SIZE, TILE_SIZE); // Top left glEnd(); glPopMatrix(); }
A noter que le 480 de la ligne glTranslated(x * TILE_SIZE - 32, 480 - y * TILE_SIZE - 64, 0); est la taille de la fenêtre, car avec SDL l'origine des x se trouve "en haut a gauche" et avec OpenGL "en bas a gauche". La aussi, comment ce changement doit il être traite de cette façon ?
Voici pour finir le code appellant cette fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 bool map_draw(map *p_map) { int x, y; glLoadIdentity(); glOrtho(0.0f, 480, 0, 480, -100.0f, 100.0f); for (y=0;y<p_map->height;y++) { for (x=0;x<p_map->width[y];x++) { if (p_map->pp_tile[y][x].key == '_') { glColor3f(1, 1, 0); } else if (p_map->pp_tile[y][x].key == '#') { glColor3f(1, 0, 0); } square_draw(x, y); } } return true; }
Partager