OpenGL et GLUT, le joystick
On y a acces comme la souris ou le clavier en GLUT, c'est-à-dire tres simplement :). En fait lorsque l'on fait notre fonction main() en GLUT, on y place des fonctions de Callback mais aussi une ligne plutot bizarre, la ligne glutMainLoop();: à partir de ce moment là, notre programme a lancé son"demon evenementiels", il ecoute alors tout les périphériques que l'on a specifié dans les callbacks. Ex : glutKeyboardFunc(keyboard); : les évènements qui arrivent par le clavier seront exploités par la fonction keyboard, le tube contient des définitions de variables prédéfinies. Ainsi pour le joystick on aura :
void glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);On a donc dans notre main (ou plus tard) un truc du style glutJoystickFunc(joystick, 10); où le temps de rafraichissement de l'état du joystick(pollinterval) est de 10ms et joystick une fonction prototypée de la façon suivante :
void joystick(unsigned int buttonMask, int x, int y, int z)
{
...
}
où, vous vous en doutez, buttonMask est égal au bouton appuyé, et x,y, et z sont les valeurs du positionnement des axes. Voilà le fichier source fourni avec GLUT, il montre tres bien comment on exploite ensuite la fonction de contrôle du joystick :
/* Copyright (c) Mark J. Kilgard, 1997. */ /* This program is freely distributable without licensing fees and is provided without guarantee or warrantee expressed or implied. This program is -not- in the public domain. */ /* En gros on peut le distribuer comme on veut mais on garanti rien, /!\ :) Le programme n est pas dans le domaine public */
#include <stdio.h> #include <stdlib.h> #include <GL/glut.h>
void joystick(unsigned int buttonMask, int x, int y, int z)
{
printf("joy 0x%x, x=%d y=%d z=%d\n" , buttonMask, x, y, z);
}
void joyPoll(void)
{
printf(" force\n" );
glutForceJoystickFunc(); //Oblige GLUT à sonder le joystick en permanence
}
void menu(int value)
{
switch(value)
{
case 1: // Premier cas on se sert du joystick de maniere normale
glutJoystickFunc(joystick, 100);
glutIdleFunc(NULL);
break;
case 2: // Second cas on désactive le joystick.
glutJoystickFunc(NULL, 0);
glutIdleFunc(NULL);
break;
case 3: // Oblige GLUT a sonder le joystick en permanence
glutJoystickFunc(joystick, 0);
glutIdleFunc(joyPoll);
break;
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
void keyboard(unsigned char c, int x, int y)
{
if (c == 27) exit(0);
}
int main(int argc, char **argv)
{
glutInit(& argc, argv);
glutCreateWindow(" joystick test" );
glClearColor(0.29, 0.62, 1.0, 0.0);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutCreateMenu(menu);
glutAddMenuEntry(" Active le joystick callback" , 1);
glutAddMenuEntry(" Desactive le joystick callback" , 2);
glutAddMenuEntry(" Force le sondage du joystick" , 3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutMainLoop();
return 0; /* ANSI C a besoin du retour d'un entier */
}
Ce document a été publié sur la version 3 du G.C.N. par Glutro.
- Auteur Original : Glutro
- Date de publication : 28 janvier 2002

