Salut à tous!
Voilà, je suis en train de développer un petit jeu de bataille navale en C, en utilisant l’openGL (la librairie GLUT parce qu’il parait que c’est la plus simple).
Je débute en OpenGL, et j’ai un peu de mal, donc je viens vous demander de l’aide
Premièrement, voici le code de mon jeu.
Pour le moment, tout ce qu’il fait c’est afficher la grille de la bataille navale, au moyen d’une fonction appelée tableaugl que j’ai écrite et qui affiche un tableau de jeu, centré sur 0,0,0, perpendiculaire à l’axe Z, et de taille comprise entre -1 et 1 sur x et y. J’ai fait simple pour commencer.
[code]#include <GL/glut.h>
//#include <GL/gl.h>
//#include <GL/glu.h>
void initialise();
void affiche();
void clavier(unsigned char touche,int x,int y);
int tableaugl(int nbln,int nbcol,float angle);
int fenetre;
int font=(int)GLUT_STROKE_ROMAN;
int main(int argc,char** argv)
{
glutInit(&argc,argv); // on récupère les arguments de la ligne de commande
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
fenetre = glutCreateWindow("Bataille Navale"); // on affiche la fenêtre OpenGL avec son titre
glutFullScreen(); // on met la fenêtre en plein écran
glutKeyboardFunc(clavier); // on définit la fonction qui nous permet de récupérer les saisies clavier
initialise(); // on appelle la fonction qui va initialiser l'affichage OpenGL
glutDisplayFunc(affiche); // on définit la fonction qui nous permet d'afficher à l'écran
glutMainLoop();
return 0;
}
void initialise()
{
glClearColor (0.5,0.5,1.0,0.0); // couleur de fond à l’initialisation
// épaisseur du trait
glLineWidth(4.0);
// positionnement de la caméra
glMatrixMode(GL_MODELVIEW);
gluLookAt(0,0,1,0,0,0,0,1,0);
// valeurs de la vue
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}
void affiche()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f (1.0,1.0,0.0);
// affichage du tableau de jeu
tableaugl(10,10,0);
// affichage d'une lettre
glPushMatrix();
glTranslatef(0, 0, 0);
glutStrokeCharacter(&font, 'a');
glPopMatrix();
glutSwapBuffers();
}
void clavier(unsigned char touche,int x,int y)
{
usleep(100);
// si l'utilisateur presse ECHAP on quitte
if (touche == 27)
{
glutDestroyWindow(fenetre); // on ferme la fenêtre OpenGL
exit(0); // et on quitte le programme
}
}
int tableaugl(int nbln,int nbcol,float angle)
{
float i,hln,lcol;
float marge[4];
// marges laissées sur les cotés du tableau
marge[0] = 0.2; // haut
marge[1] = 0.1; // bas
marge[2] = 0.1; // droite
marge[3] = 0.1; // gauche
glColor3f (1.0,1.0,1.0); // réglage de la couleur du tableau
// calcul de la hauteur des lignes et de la largeur des colones
hln = (2.0-marge[0]-marge[1])/(nbln);
lcol = (2.0-marge[2]-marge[3])/nbcol;
// tracé des lignes
for (i=0;i<nbln+1;i++) // tracé des lignes
{
glBegin(GL_LINES);
glVertex3f (-1.0+marge[3], ihln-1.0+marge[1], 0.0);
glVertex3f (1.0-marge[2], ihln-1.0+marge[1], 0.0);
glEnd();
}
// tracé des colones
for (i=0;i<nbcol+1;i++) // tracé des colones
{
glBegin(GL_LINES);
glVertex3f (ilcol-1.0+marge[3], -1.0+marge[1], 0.0);
glVertex3f (ilcol-1.0+marge[3], 1.0-marge[0], 0.0);
glEnd();
}
}[/code]
Je compile ce programmme, tout marche bien comme je veux.
Cependant il y a des trucs que je ne comprend pas trop.
Premièrement
Comme vous le voyez, j’ai utilisé la fonction glulookat de cette manière:
gluLookAt(0,0,1,0,0,0,0,1,0);
Si j’ai bien compris, ma caméra est placée (x,y,z) en 0,0,1, elle regarde en 0,0,0, et le point central haut de la caméra est en 0,1,0. Jusque là tout va bien.
Seulement, si je marque :
gluLookAt(0,0,1,0,1,0,0,2,0);
ben le faut de mon tableau est effacé à partir du moment ou il devient positif sur l’axe Y…
Donc je ne suis pas sûr d’avoir compris comment utiliser cette fonction.
Deuxièmement
Comme vous le voyez aussi j’essaie d’afficher le caractère ‹ a › au niveau de l’origine des axes, dans la fonction « affiche ».
Et lorsque j’exécute le programme, je ne vois pas ce fameux caractère a…
Glop m’a aimablement donné un lien vers un code C dans ce topic. Mais je n’arrive pas à réutiliser celà dans mon programme, puisque ce que j’ai fait ne marche pas.
Donc il y a des trucs que je n’ai pas bien compris, si quelqu’un peut m’aider…
Si vous voyez moyen d’améliorer mon code niveau utilisation de l’OpenGL, dites toujours, je débute donc je suis certain qu’il y a moyen d’améliorer.
Pour compiler le code sous Windows, remplacez simplement la déclaration des librairies par :
[quote]#include <gl\glut.h>
#include <gl\gl.h>
#include <gl\glu.h>[/quote]
Voilà, donc si vous pouviez m’expliquer pourquoi ça marche mal, les améliorations possibles, des conseils… ça m’aiderai beaucoup et je vous en serait très reconnaissant
J’ai lu quelques cours sur l’OpenGL :
http://www.univ-reims.fr/UFR/Info/Image
http://www.univ-reims.fr/Labos/LERI/membre/bittar/03OpenGL
http://www.essi.fr/~buffa/cours/synthese_image/index.html
J’ai fait quelques TP aussi : http://www.irit.fr/~Loic.Barthe/Enseigneme…O5/TP1/tp1.html
Merci!