Problème d'animation avec OpenGL.....

Problème d'animation avec OpenGL..... - C++ - Programmation

Marsh Posté le 20-10-2005 à 22:57:54    

bonsoir tt le monde,
 
J'ai un gros problème!!Je suis en école d'ingé et j'ai un projet en C++ qui est de concevoir un Tétris avec OpenGL et GLUT... :D Mais pour l'instant j'ai dessiné l'interface (je sais c'est hyper moche....) et j'ai dessiné un carré rouge mais je n'arrive à faire bouger selon y ce dernier....En fait il bouge uniquement quand je réduis et je restaure la fenêtre.....
 
Voilà mon code :  
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <GL/glut.h>
  5. #include <time.h>
  6. #include <windows.h>
  7. int x=0,y=0,z=0;
  8. void Ecrire_chaine(char *s,int x,int y)
  9. {
  10. int longueur=strlen(s),i;
  11. glRasterPos2i(x,y);
  12. for(i=0;i<longueur;i++)
  13.  glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,s[i]);
  14. }
  15. void fond()
  16.      {
  17.      glPushMatrix();       
  18.      glColor3f(0.5,0.5,0.6);
  19.      glBegin(GL_QUADS);
  20.  glVertex2i(0,0);
  21.  glVertex2i(0,500);
  22.  glVertex2i(400,500);
  23.  glVertex2i(400,0);
  24. glEnd();
  25. glColor3f(0,0,0);
  26. glBegin(GL_LINES);
  27.  glVertex2i(400,500);
  28.  glVertex2i(400,0);
  29.  glVertex2i(401,500);
  30.  glVertex2i(401,0);
  31.  glVertex2i(402,500);
  32.  glVertex2i(402,0);
  33. glEnd();
  34. glColor3f(0,0,0);
  35. glBegin(GL_POLYGON);
  36.  glVertex2i(35,35);       //base cadre noir
  37.  glVertex2i(35,50);
  38.  glVertex2i(355,50);
  39.  glVertex2i(355,35);
  40. glEnd();
  41.     glColor3f(0,0,0);
  42.     glBegin(GL_POLYGON);
  43.         glVertex2i(60,50);       //gauche cadre noir
  44.         glVertex2i(60,500);
  45.         glVertex2i(75,500);
  46.         glVertex2i(75,50);
  47.     glEnd();
  48.    
  49.     glColor3f(0,0,0);
  50.     glBegin(GL_POLYGON);
  51.         glVertex2i(325,50);       //droit cadre noir
  52.         glVertex2i(325,500);
  53.         glVertex2i(310,500);
  54.         glVertex2i(310,50);
  55.     glEnd();
  56.    
  57.     glColor3f(0.9,0.95,0.95);
  58.      glBegin(GL_QUADS);
  59.  glVertex2i(75,50);
  60.  glVertex2i(75,500);
  61.  glVertex2i(310,500);
  62.  glVertex2i(310,50);
  63. glEnd();
  64.     }
  65.    
  66. void carre()
  67.    
  68.      glPushMatrix();
  69.      glTranslated(x,y,z);
  70.         glBegin(GL_POLYGON);
  71.            glColor3f(1, 0, 0);
  72.            glVertex2i(500, 300);
  73.            glVertex2i(500, 350);
  74.            glVertex2i(450, 350);
  75.            glVertex2i(450, 300);
  76.         glEnd();
  77.      glPopMatrix();
  78.      y-=50;
  79. }
  80.    
  81.    
  82.    
  83. void affichage(void)
  84. {
  85. glClear(GL_COLOR_BUFFER_BIT);
  86. fond();
  87.     carre();
  88.     glFlush();
  89. }
  90. void redim(int l,int h)
  91. {
  92. glViewport(0,0,l,h);
  93. glMatrixMode(GL_PROJECTION);
  94. glLoadIdentity();
  95. gluOrtho2D(0,l,0,h);
  96. glMatrixMode(GL_MODELVIEW);
  97. glLoadIdentity();
  98. }
  99. int main(int argc,char **argv)
  100. {
  101. /* Initialisation */
  102. glutInit(&argc,argv);
  103. /* Initialisation des paramètres */
  104. glutInitWindowPosition(50,50);
  105. glutInitWindowSize(650,500);
  106. glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);
  107. /* Création de la fenêtre */
  108. glutCreateWindow("Un tétris tout moche...." );
  109. /* Association d'évènements */
  110.     glutDisplayFunc(affichage);
  111.     glutReshapeFunc(redim);
  112. /* Initialisation de OpenGL */
  113. glClearColor(1,1,1,1);
  114. glutMainLoop();
  115.     return 0;
  116. }


 
Donc en fait j'aimerai que le carré rouge bouge selon y comme dans un Tétris normal c'est-à-dire à intervalle de temps régulier..... :heink:  
 
Merki bcp pour vos répoonses!!!
 
A+

Reply

Marsh Posté le 20-10-2005 à 22:57:54   

Reply

Marsh Posté le 20-10-2005 à 23:13:48    

Faudrait deja clear le zbuffer...
 
edit : bon sinon c'est un probleme de programation evenementielle. Tu t'es demandé quand étais appelée ta fonction affichage?


Message édité par retrox le 20-10-2005 à 23:18:38
Reply

Marsh Posté le 20-10-2005 à 23:21:29    

bah en fait j'me doute que la fonction affichage est appelé uniquement quand windows détecte une modification au niveau de la fenêtre...dc comment appeler "affichage()" par exemple toutes les 0.5s ???
 
C'est très loin d'être clair tout ça....merki

Reply

Marsh Posté le 21-10-2005 à 10:55:56    

Regarde du coté des timers (ça existe dans GLUT).

Reply

Marsh Posté le 21-10-2005 à 10:57:37    

Salut,
   Je ne sais si je vais pouvoir t'aider car je n'ai que 2 jours d'opengl et je ne connais pas ton langage. Alors, dis moi si j'ai bien compris ce que tu as codé: tu définis ton carré avec ses coordonnée, coordonnées que tu modifies en fin (y - 50) et tu veux que ce soit ta fonction affichage qui aille rechercher ton "objet" carré avec les nouvelles coordonnées ? Si c'est cela, à ta place je ferai autrement:
   Si j'ai bien compris, opengl est un "moteur" graphique statique" librairie, donc il affiche lorsque les paramètres que tu lui passe changent. Donc pas la peine de vouloir passer par la fonction affichage pour les animes.
  Tu crées une fonction qui décrit ta translation: de y_début à y_max avec un pas de n. Dans ta fonction affichage avant le carré tu mets (gltranslated x (appel_fonction) z) (avec la bonne syntaxe) et tu reinitialise tes coordonnées pour le cadre avec un glLoadIdentity.
  Et puis tiens: http://www-evasion.imag.fr/Membres [...] engl3.html
 plus le fameux site Nehe avec pleins d'exemple de code. (Y'en a trop peu pour scheme  :cry: )
  Maintenant si j'ai dit des conneries, dites le moi, ça pourra me servir.
A+


Message édité par le_courtois le 21-10-2005 à 12:44:55
Reply

Marsh Posté le 21-10-2005 à 12:00:53    

OpenGL n'est pas un moteur, c'est une librairie.
Elle fait ce qu'on lui demande.
Quant à appeler une fonction qui modifie l'etat de la simu dans la fonction d'affichage, c'est une mauvaise idée.
La fonction d'affichage, comme son nom l'indique est faite pour afficher.
Dans le cas présent, la simu c'est le jeu tetris. Le programe doit avoir une représentation interne de l'état du jeu indépendante d'une quelconque méthode de rendu.

Reply

Marsh Posté le 21-10-2005 à 12:29:30    

Retrox -> Ah ok merci et donc désolé.
  Cependant une question, en essayant de ne pas pourrir son topic (et peut être, mes suis-je mal exprimé, problème de lexique spécifique): dans mes exemples, on va prendre celui d'un rotation
  L'auteur définit un compteur pour la rotation:

Code :
  1. [(define (counter-generator init step min max)
  2.   (letrec ((value init)
  3.            (loop
  4.             (lambda ()
  5.              ......
  6.       (set! value (+ value step))
  7.       (loop))))


puis dans la fonction principale d'affichage:

Code :
  1. ;; Our rotation variables
  2. (define trirot (counter-generator 0 2 0 360))
  3. ;; Our main function that does the drawing
  4. (define (gl-draw)
  5.   (glClear (+ GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT))
  6.   (glLoadIdentity)
  7.   (glTranslatef -1.5 0 -6)
  8.   (glRotatef (trirot) 0 1 0) <--ici, appel aux "arguments" de rotation
  9.  
  10.   (glBegin GL_TRIANGLES)
  11.  
  12.   (glColor3f 1 0 0)
  13.   (glVertex3f 0 1 0)
  14.   (glColor3f 0 1 0)
  15.   (glVertex3f -1 -1 1)
  16.   (glColor3f 0 0 1)
  17.   (glVertex3f 1 -1 1)
  18. (glEnd)
  19. (glflush)


 Bon, je mets pas tout le code, mais ça ressemble plus à ce que je voulais lui expliquer. Et ça, c'est "mal"?

Reply

Marsh Posté le 21-10-2005 à 13:25:11    

Si c'est juste pour faire tourner un triangle, c'est pas "mal". Mais quand il s'agit de faire des choses un peu plus compliquées (par exemple, quand dans son tetris il y aura quelques dizaines de pieces deja tombées), c'est pas dans la fonction d'affichage qu'il faut gérer ça. Une fonction d'affichage doit normalement afficher l'état d'une simulation à un instant donné.

Reply

Marsh Posté le 21-10-2005 à 13:48:30    

Une dernière et j'arrête, j'effacerai mes posts à la demande.
Retrox -> on est d'accord. En fait j'avais mal compris la question. J'avais cru comprendre qu'en fait il voulait appeler régulièrement sa fonction affichage, laquelle se chargeait de modifier le système puisque son changement de coordonnées se faisait dans la définition de carré(), à la fin.
 Alors qu'en fait, c'est le système qui doit appeler l'affichage  lorsqu'il change. Le peu que j'avais compris de son code et de sa question me faisait penser qu'il essayait via pour la première solution. Mais mes connaissances sont faibles. Donc Dsl  :jap:   -->[]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed