Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL_EnableKeyRepeat(....,....)

    12 septembre 2020 à 18:43:23

    bonjour !

    dans mon code ,il fallait utiliser cette foction SDL_EnableKeyRepeat(....,....) pour pouvoir deplacer une image avec plus de 1 seul pixel .Mais malheureusement cette fonction ne se trouve pas dans la bibliotheque SDL2.0 ,du coups j'sais pas quoi faire !!!! 

    • Partager sur Facebook
    • Partager sur Twitter
      13 septembre 2020 à 2:57:52

      Salut,

      Le key repeat est un artifice. Dis-toi que quiconque t'as suggéré de l'utiliser s'est moqué de toi.

      Dans un premier temps, pour être un peu sérieux, on n'utilise peu, voire pas du tout les event de la SDL en brut comme c'est fait sur le cours sur le C de ce site.

      Nous créons généralement notre propre surcouche. Par exemple, pour mes jeux j'utilise une variation de ce qu'on trouve dans ce tuto. Ma structure est plus complète parce que j'y intègre d'autres trucs qui me sont utiles. Mais en tout cas, le concept est le même.

      Sinon, pour simuler le key_repeat, il suffit de générer un tick tant que la touche est appuyée et de prendre ce tick en compte. Tu peux aller voir sur cette page une proposition de structure et quelques fonctions de temporisateurs. Le repeat est ce dont tu as besoin.

      ça rendrait un truc dans ce genre là :

      CEV_Timer spaceRepeat;
      CEV_timerInit(&spaceRepeat, 1000);//un tick par seconde
      
      //dans la boucle pollevent :
      while (SDL_PollEvent(&event))
          {
              switch (event.type)
              {
                  /**keyboard**/
                  case SDL_KEYDOWN :
      
                      if(event.key.keysym.scancode = SDL_SCANCODE_SPACE)
                          spaceRepeat.run = true;
                      
                  break;
      
                  case SDL_KEYUP :
                      if(event.key.keysym.scancode = SDL_SCANCODE_SPACE)
                          spaceRepeat.run = false;
                  break;
               }
          }
      
      //récupération du tick :
      if(CEV_timerRepeat(&spaceRepeat))//si on a un tick
         move+=5; //on déplace de 5.
      
      

      Il existe un champ repeat dans la structre SDL_KeyboardEvent, mais il ne semble pas être documenté. Cependant, j'ai du faire en sorte de ne pas traiter les SDL_KEYDOWN lorsqu'il est vrai dans ma gestion des événements parce que ça parasitait le fonctionnement. Il me semble qu'il passe à 1 par intervalle lorsqu'une touche est maintenue, mais il n'y a pas possibilité de contrôler le temps entre chaque mise à 1. Selon moi, il reporte la répétition de touche configurée dans l'OS, un peu comme si je reste appuyé sur le 'a' dans un éditeur de text, genre :

      aaaaaaaaaaaaaaaaaaaaa

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        13 septembre 2020 à 10:10:47

        En effet, peu importe que la fonction existe ou pas ce n'est pas une façon de programmer car chaque système et chaque utilisateur peut court-circuiter le principe de touche répétées. Et certains désactivent complètement cette fonctionnalité.

        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

        SDL_EnableKeyRepeat(....,....)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown