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