IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Déplacement d'un objet 2D lors de pression de touche


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Déplacement d'un objet 2D lors de pression de touche
    Hello,

    Je me suis mis il y a peu de temps à OpenGL et j'ai un petit souci.
    Mon but est de créer un rectangle qui, lors de l'appui sur une touche, se déplace à droite. J'ai procédé comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void PongDisplay()
    {
    	pong_x += 0.001;
    	glutPostRedisplay();
    }
     
    void keyb(unsigned char key, int x, int y)
    {
    	switch(key)
    	{
    		case 97:
    			glutIdleFunc(PongDisplay);
    			break;
    		default:
    			glutIdleFunc(NULL);
    			break;
    	}
     
    }
    Mon rectangle se déplace bien vers la droite, cependant je n'arrive pas à l'arrêter ! Puisque la fonction du clavier ne permet pas de récupérer l'état de la touche... J'ai essayé en mettant le contenu de ma fonction PongDisplay sous le case 97 mais bien sûr c'est très lent et de plus ça saccade (puisque je dois augmenter l'intervalle de laquelle va avancer mon rectangle).
    Voilà je voulais donc savoir comment arrêter le défilement de ce rectangle.
    Merci !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Tu devrais peut-être jeter un oeil à la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y));
    ou alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void glutSpecialFunc (void (*func)(int key, int x, int y));
    La dernière fonction te permettant de gérée les touches clavier qui n'ont pas de code ASCII (les flèches, F1, ...)

    Plus d'info ici

    Bonne chance.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Hello,

    J'utilise déjà la fonction glutKeyboardFunc pour gérer la frappe au clavier (glutKeyboardFunc(keyb) dans mon exemple) mais le problème est toujours là : je ne peux pas savoir quel est l'état de la touche !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    ça fait un moment que j'ai pas utilisé glut mais si je me souviens bien tu as une fonction glutKeyboardUp ou qque chose comme ça qui te signale qu'une touche n'est plus appuyée.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Bizarre... si je ne m'abuse glutKeyboardFunc ne renseigne key que si une touche est pressée.

    Pour ton problème de saccade, c'est surement dû au fait que tu lances le raffraichissement seulement quand il y a une interaction au clavier.
    Essaye de modifier la variable sur la position de ton rectangle quand tu appuie au clavier mais lance le rafraichissement toujours dans glutIdleFunc (que tu ne devrais pas appeler via l'intéraction du joueur).

    Voila, bonne chance.
    PS: Si tu as toujours des pb tu peux m'envoyer ton code, j'y jeterais un coup d'oeil.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ok c'est bon, il suffisait d'utiliser la fonction glutKeyboardUpFunc.
    Merci à tous !

    P.S.: Pour la fonction, voir ici http://pyopengl.sourceforge.net/documentation/manual/glutKeyboardUpFunc.3GLUT.html

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Tiens au fait, avant de mettre le topic comme résolu... Voici mon code, pourriez-vous me dire si c'est correct ou si c'est du bûcheronnage ?
    En fait je fait un casse briques et j'aimerais savoir si je pars juste... Ou si j'aurai de la peine pour la suite si je commence comme ça ! Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdio.h>
    #include <GL/glut.h>
     
    float pong_x = 0.0;
    float pong_y = -0.8;
    float go_x = 0.0;
     
    void init()
    {
    	glClearColor(0.0, 0.0, 0.0, 0.0);
    	glShadeModel(GL_FLAT);
    }
     
    void display()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
     
    	glBegin(GL_POLYGON);
    		glVertex2f(pong_x, pong_y);
    		glVertex2f(pong_x, pong_y+0.05);
    		glVertex2f(pong_x + 0.2, pong_y + 0.05);
    		glVertex2f(pong_x + 0.2, pong_y);
    	glEnd();
     
    	glutSwapBuffers();
    }
     
    void PongDisplay()
    {
    	pong_x += go_x;
    	glutPostRedisplay();
    }
     
    void keyb(unsigned char key, int x, int y)
    {
    	switch(key)
    	{
    		case 'a':
    			go_x = -0.001;
    			glutIdleFunc(PongDisplay);
    			break;
    		case 'd':
    			go_x = 0.001;
    			glutIdleFunc(PongDisplay);
    			break;
    		default:
    			glutIdleFunc(NULL);
    			break;
    	}
    	printf("%d\n", key);
    }
     
    void keybup(unsigned char key, int x, int y)
    {
    	glutIdleFunc(NULL);
    }
     
    int main(int argc, char **argv)
    {
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    	glutInitWindowSize(300, 300);
    	glutInitWindowPosition(100, 100);
    	glutCreateWindow(argv[0]);
    	init();
    	glutDisplayFunc(display);
    	glutKeyboardFunc(keyb);
    	glutKeyboardUpFunc(keybup);
    	glutMainLoop();
    	return 0;
    }

  8. #8
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Salut,

    Personnellement je te conseil d'afficher tes carré dans une display liste et de faire appel à ces display liste quand tu a besoin d'afficher un carré en utilisant des glTranslated() pour le placer, c'est bien plus rapide.

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Sa ne vaut pas le coup de faire une display list pour des petits éléments: on perd plus de temps en appel de la list qu'on en gagne en dessin.
    C'est ce qui est dit dans le livre d'OpenGL.
    (ya un appelle a glTranslate en plus alors juste pour un carré!!)
    Sa reste à vérifier........

  10. #10
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Une display list peu êre ou pas utilisé dans ton cas, et puis pour un casse brique c'est pas cela qui va tt faire rammer

    Sinon je te conseil pas trop d'utiliser "glutIdleFunc" dans ce sens, si mes souvenirs sont bon, c'est la fonction qui est lancé dans les moments "libre" de ton programme et du CPU.

    Donc si tu utilises glutIdleFunc(PongDisplay); et que tu appuyes sur la touche toto ton triangles va se déplacer a l'infini comme tu l'as deja constaté, à cela tu as trouvé la parade glutIdleFunc(NULL);

    glutIdleFunc() qui contient en principe un pointeur de fonction dans laquelle on trouve glutPostRedisplay() permet l'affichage de ta scène.

    Pour l'instant pas de problème tout marche sur des roulettes.
    Mais si tu veux que ton carré s'anime de bas en haut (pour une option qui tombe), il faut que glutPostRedisplay() soit relancé regulièrement pour voir l'animation du cube "tomber", première solution tu appuyes sur une touche et "o" miracle tu vas voir l'animation, mais problème...

    Bon je sais pas si c'est clair tout ce que je raconte.

    En gros un petit changement serait le bienvenu je pense dans ton mini programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    // dans main ajouter 
    /* Main Loop */
    void main_loop(void);
     
    /* Start Main*/
    int main(int argc, char **argv) 
    { 
    ...
    // a ajouter
       glutIdleFunc(main_loop); 
    ...
       glutMainLoop();
    }
     
    //dans main loop
    /* ------------------------- Main Loop ------------------------- */
     
    void main_loop(void)
    {
    	glutPostRedisplay();
    }
    // beyb "simplifié"
    void keyb(unsigned char key, int x, int y) 
    { 
       switch(key) 
       { 
          case 'a': {
             pong_x -= 0.001; 
             };break; 
          case 'd': {
             pong_x += 0.001; 
             };break; 
       } 
       printf("%d\n", key); 
    }
    C'est simplifié, et il y a beaucoup encore a faire, pour "détacher" l'objet qui tombe et le rendre + "static" ou le faire disparaitre
    mais c'est un bon début et un bon sujet d'étude.

    Have fun !!

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ok je vais étudier tout ça et je vous en donnerai des nouvelles.
    Merci pour toutes ces précieuses infos !

Discussions similaires

  1. Problème de déplacement d'un objet dessiné
    Par mhamedbj dans le forum Graphisme
    Réponses: 4
    Dernier message: 04/05/2012, 18h32
  2. déplacement d'un objet
    Par bazzouz dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 25/08/2007, 01h01
  3. Réponses: 7
    Dernier message: 03/08/2007, 14h19
  4. Réponses: 7
    Dernier message: 26/01/2007, 22h11
  5. Déplacement d'un objet dans un TPageControl
    Par nek_kro_kvlt dans le forum Delphi
    Réponses: 4
    Dernier message: 12/10/2006, 18h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo