Je suis débutant à OpenGL et j'essaie de créer un jeu dans lequel j'ai une image brute. Lorsque le jeu commence, j'affiche cette image et je souhaite pouvoir cliquer dessus et afficher une autre image par la suite. J'ai essayé d'utiliser la fonction glutmousefunc code> mais lorsque j'essaie d'exécuter le programme, je reçois un message qui dit que le programme a cessé de fonctionner.
Voici quelques parties de mon code: j'ai une variable globale onmouse; Si je clique sur le bouton de la souris, la variable prend la valeur 1 et si elle a la valeur 1, j'essaie de charger la deuxième image.
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT );
// setup texture mapping
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );
glPushMatrix();
glBegin( GL_QUADS );
glTexCoord2d(1.0,0.0); glVertex3d(1.0,1.0, 1.0);
glTexCoord2d(0.0,0.0); glVertex3d(-1.0,1.0,1.0);
glTexCoord2d(0.0,1.0); glVertex3d(-1.0,-1.0, -1.0);
glTexCoord2d(1.0,1.0); glVertex3d(1.0,-1.0, 1.0);
glEnd();
glPopMatrix();
glutSwapBuffers();
// free the texture
FreeTexture( texture );
3 Réponses :
Vous avez la commande erronée.
if(onMouse == 1) {
J'ai changé la commande et maintenant j'ai Glutmousefunc (MouseClicks) entre les fonctions displayfunc () et le clavierfunc () et après l'appel de Glutmainloop () Je vérifie si onmouse a la valeur 1; Le programme ne change toujours pas l'image, mais au moins maintenant, je ne m'incline pas
Qu'est-ce que je fais mal? P>
Vous attendez que GlutmouseFunc attend un clic de souris. Ce n'est pas la façon dont les travaux de gloutent (la glouteuse ne fait pas partie de OpenGL BTW). Un autre rappel à enregistrer est la fonction de dessin (généralement appelée
affichage code> dans les programmes basés sur la colonne). P>
une fois que vous avez entré la boucle principale de glit (
GluttMainloop () Code > Appelez) Les événements utilisateur sont traités et si une redisplay est demandée, la fonction d'affichage est appelée. P>
Voici ce que vous faites (pseudocode simplifié) P>
// Define bitmasks for mouse status, we assume mice have less than 17 buttons #define MB_LEFT 0 #define MB_MIDDLE 1 #define MB_RIGHT 2 #define LMB_PRESSED (1<<0) #define MMB_PRESSED (1<<1) #define RMB_PRESSED (1<<2) #define LMB_CLICKED (1<<16) #define MMB_CLICKED (1<<17) #define RMB_CLICKED (1<<18) #define MB_PRESSED(state, button) (1<<(button)) #define MB_CLICKED(state, button) (1<<((button)+16))) #define MB_MASK_PRESSED 0x0000ffffL #define MB_MASK_CLICKED 0xffff0000L uint32_t mouse_status = 0; void onMouseButton(int button, int state, int x, int y) { int b; switch(button) { case GLUT_LEFT_BUTTON: b=MB_LEFT; break; case GLUT_MIDDLE_BUTTON: b=MB_MIDDLE; break; case GLUT_RIGHT_BUTTON: b=MB_RIGHT; break; } if(mouse_status & MB_PRESSED(b) && GLUT_UP == state) { mouse_status |= MB_CLICKED(b); } if( !(mouse_status & MB_PRESSED(b)) && GLUT_DOWN == state) { mouse_status = (mouse_status & ~(0L | MB_CLICKED(b))) | MB_PRESSED(b); } glutPostRedisplay(); } void display(void) { if(mouse_status & MB_CLICKED(MB_LEFT)) { /* do something */ ⦠/* clear the click flag */ mouse_status &= ~MB_MASK_CLICKED; } } int main(â¦) { ⦠glutCreateWindow(â¦); glutDisplayFunc(display); glutMouseFunc(onMouseButton); glutMainLoop(); }
Autre chose, bien que je ne puisse pas dire avec sûr du petit extrait de code que vous fournissez, c'est que vous feriez mieux de charger les actifs à partir du début du programme, plutôt que d'attendre qu'un événement utilisateur le fasse. Chargez-les d'abord et changez simplement glutmousefunc code> registre un rappel: une fonction à appeler sur des événements spécifiques (ici Evénements de souris). Ces événements sont collectés par
glutmainloop code>, qui n'a pas encore été appelé lorsque vous testez
Onmouse code>. P>
Texture Code> vers quelle édition correspondre à la texture que vous souhaitez afficher, puis. P>
Votre question concerne la glutte, pas OpenGL.