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

Bibliothèques, systèmes et outils C Discussion :

glfw et la gestion du clavier


Sujet :

Bibliothèques, systèmes et outils C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut glfw et la gestion du clavier
    bonjour, pour le plaisir d'apprendre je fait un petit pong en C avec opengl et utilise glfw pour la geston des fenetres et le input clavier.
    mon probleme est que quand j'appuis sur la touche 'a' pour deplacer la raquette vers la gauche raqH, elle va completement a gauche aulieu de bouger d'un cran.



    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
     glClear(GL_COLOR_BUFFER_BIT);
    while(running==GL_TRUE)
    {
            running = !glfwGetKey(GLFW_KEY_ESC)&& glfwGetWindowParam(GLFW_OPENED);
     
            if( glfwGetKey('A'))
            {
                raqH->x -=.01;   //deplace le x de la raquette du joueur vers la gauche
            }
            if( glfwGetKey('D'))
                raqH->x +=.01; //deplace le x vers la droite 
     
            now = glfwGetTime();  //gere le temps pour deplacer la ball
            if(now-oldtime>=.025)
            {
                oldtime=now;
                res = moveball();  // renvois autre chose que 0 si la balle sort des limites
            }
     
            if(res!=0)
                break;
     
            checkRaq(); // verifie que la raquette est dans les limites sinon la place a la limite la plus proche
            drawMachine(); //dessine tout les objets de la scenes actuellement balle decore et raquette
            glfwSwapBuffers();
    }
    en faite je comprend le probleme mais je sais pas comment le regler avec glfw.
    autre fois on faisait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(keypressed()) //conio kbhit() 
    //linux j'utilisais un bout de code vu dans beginning linux programming pour les
    //fonction kbhit() et getch() 
       key = getkey(); //sous dos avec conio c'etait getch() 
    if(key=='a')
    {
       key = 0; //empeche de revenir ici saus si la touche 'a' a ete presse de nouveau
       raqH->x-=.01;
    }
    mais la je vois pas comment implementer ca.
    merci de votre patience

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Tu peux ajouter une temporisation dans ta boucle principale : de même que tu attends if(now-oldtime>=.025) pour déplacer la balle, tu pourrais attendre un peu pour déplacer la raquette.

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    ben je l'avais deja fait et ca marchait mais je voulais justement eviter ca. sinon pour chaque objet a dessiner et qui ne sont pas a une position constante (car je complique au fure et a messure) faudrait faire ce genre de reglage.

    au faite ma fonction drawMachine(); affiche tous les objets declarer en globales dans un objet.h je me dit que en multipliant les variables globales ca deviendra puant non?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    ben je l'avais deja fait et ca marchait mais je voulais justement eviter ca. sinon pour chaque objet a dessiner et qui ne sont pas a une position constante (car je complique au fure et a messure) faudrait faire ce genre de reglage.
    Tu peux aussi tu dire que tout dépend du temps et que l'affichage n'est pas forcement régulier.

    exemple : ton aire de jeu fait 100x100, tu veux que ta balle traverse l'écran en 2 secondes, que la raquette le fasse en 1.
    À chaque affichage, il faut donc bouger la balle de 100 x temps_en_seconde / 2 et si a est enfoncé, bouger la raquette de 100 x temps_en_seconde. temps en seconde est le temps écoulé entre les deux rafraichissements.

    On peut donc écrire quelque chose comme :

    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
    while(running==GL_TRUE)
    {
          /* Calcul du temps écoulé */
           now = glfwGetTime();
           temps_ecoule = now-oldtime;  
     
          /* Gestion de la raquette */
           if( glfwGetKey('A')) {
                raqH->x -= temps_ecoule;   
            }
            if( glfwGetKey('D')) {          
                raqH->x -= temps_ecoule;   
            }
     
           /* Gestion de la balle */
           /* on bouge la balle en fonction du temps écoulé depuis le 
               dernier déplacement */
            res = moveball(temps_ecoule);  
     
            if(res!=0)
                break;
     
           /* Rendu de la scène */
            checkRaq(); 
            drawMachine(); 
            glfwSwapBuffers();
     
            oldtime=now;
    }
    au faite ma fonction drawMachine(); affiche tous les objets declarer en globales dans un objet.h je me dit que en multipliant les variables globales ca deviendra puant non?
    Effectivement, il y a des méthodes plus propres.
    On peut par exemple s'organiser par module : raquette, balle, décors...
    Définir pour chaque module des variables statiques (accessibles dans tout le module mais pas ailleurs)
    Définir pour chaque module des fonctions pour agir sur les objet : RAQ_bouge, RAQ_dessine pour bouger et dessiner les raquettes, BAL_bouge, BAL_dessine pour le balle...
    C'est un pas vers la programmation objet.

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Merci pour le conseil 1. c'est extrement utile.
    pour le second point, je sais pas si ce que tu me demande de faire c'est:
    raq.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       static Raquette * raqH  //stuctre comportant x,y,z,rgb,width,height,alive
       static Raquette *raqCPU
     
       void initRaq(); //les deux raquettes sont initialisees ici position couleur ...
       void moveRaq(int laquelle,int direction);
     
       void  drawraquettes();
    la meme chose pour ball, decore, machin_chouette,...
    graphic.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
       void drawmachine(); //qui appellera toutes les fonctions draw
                                        // drawdecor(),drawraquettes(),drawball(),drawbonus()...
    ai je compris ton conseil?

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lilington Voir le message
    ai je compris ton conseil?
    Presque.

    Voici comment j'organise ma popote quand je suis dans ce genre de problématiques :

    Code raquette.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void initRaq(); 
    void moveRaq(int laquelle,int direction);
    void  drawraquettes();

    Code raquette.c : 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
    typedef struct Raquette {...} Raquette;
    static Raquette * raqH;
    static Raquette *raqCPU;
     
    void initRaq()
    {
       ...   
    }
    void moveRaq(int laquelle,int direction)
    {
       ...   
    }
    void  drawraquettes()
    {
       ...   
    }
    Ainsi, les variables raqH et raqCPU ne sont pas accessibles depuis les autres fichiers .c. Les autres fichiers .c ne connaissent même pas l'existence de la structure Raquette, il n'en on pas besoin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Gestion évenements clavier
    Par Tips dans le forum Windows Forms
    Réponses: 9
    Dernier message: 19/04/2006, 21h29
  2. [MFC][VC++.NET]gestion évènement clavier
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 10h29
  3. Gestion du clavier
    Par Ekinoks dans le forum OpenGL
    Réponses: 12
    Dernier message: 22/08/2005, 15h36
  4. gestion du Clavier
    Par benthebest dans le forum MFC
    Réponses: 13
    Dernier message: 07/05/2005, 23h39
  5. [MX]Optimisation de la gestion du clavier
    Par yacinechaouche dans le forum Flash
    Réponses: 8
    Dernier message: 18/04/2004, 03h13

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