Pour que mes touches soient détectées immédiatement

Résolu
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011 - 4 avril 2009 à 13:30
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011 - 4 avril 2009 à 19:31
Bonjour,

j'ai un petit soucis avec la détection de touche. Je vous met le bout de code concerné plus bas pour que vous ayez une idée.
Enfait je détecte l'appuie sur trois touches (la touche échap, la flèche gauche et la flèche droite), le problème c'est que comme je l'ai programmé on a l'impression que mon jeu lagg parce que la boucle principale n'est éxecuté que toutes les une seconde. Donc quand j'appuie sur une de mes 3touches je peux avoir jusqu'a une seconde qui se passe avant que l'action qui lui est associé ne soit éxecuté.
Evidement je ne peux pas réduire ce temps dans ma boucle car les autres fonctions doivent elles être éxecuté toutes les 1s.

Comment puis je faire pour que ma boucle soit bien éxecutée toutes les 1s mais pour que quand j'appuie sur mes touches elles soient détectées immédiatement?

    while(continuer == 1)
    {

        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent > 1000) // Si 1s se sont écoulées
        {

            while (SDL_PollEvent(&event)) //on récupère les éveenements (fonction non blocante contraiement a SDL_WaitEvent).
            {
                switch (event.type)
                {
                    case SDL_QUIT: // On quitte si l'utilisateur a cliqué sur la croix.
                        continuer = 0;
                        break;

                    case SDL_KEYDOWN:
                        switch (event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE: // On quitte si l'utilisateur appuie sur la touche echap.
                                continuer = 0;
                                break;

                            case SDLK_LEFT: // On quitte si l'utilisateur appuie sur la touche echap.
                                dpltGauche(tabPlateau, pieceTombe, nbrCarreLigneTotal+1, nbrCarreColonneTotal-2);
                                break;

                            case SDLK_RIGHT: // On quitte si l'utilisateur appuie sur la touche echap.
                                dpltDroite(tabPlateau, pieceTombe, nbrCarreLigneTotal+1, nbrCarreColonneTotal-2);
                                break;

                            default:
                                break;
                        }
                        break;
                }
            }

           //// Appelle de diverse fonction ////

            tempsPrecedent = tempsActuel; // Le temps "actuel" devient le temps "precedent" pour nos futurs calculs

            //// Affichage de l'écran de fond. ////
            //// Blitage des carres. ////
            //// Actualisation de l'affichage. ////

        }
        else //Si ça fait moins de 1s depuis le dernier tour de boucle, on endort le programme le temps qu'il faut pour que sa fasse une seconde.
        {
            SDL_Delay(1000 - (tempsActuel - tempsPrecedent));
        }
    }

7 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
4 avril 2009 à 14:46
Bof t'as le choix :
tu peux utiliser un thread pour la gestion des touches et un autre pour l'affichage (cela dit, je ne sais pas si avec SDL...)
Sinon tu peux faire un truc du genre :

while(running)
{
_Gestion_Evenements();
if(temps_actuel-temps_precedent>=1s) _Affichage();
_Delay(20 ms);
}
3
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
4 avril 2009 à 13:32
Juste une petite précision, je travaille en C pas en C++
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
4 avril 2009 à 15:19
salut,

ben justement je crois pas qu'avec la sdl se soit possible.

Mais je ne sait pas quoi utiliser, c'est sa ma question.
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
4 avril 2009 à 16:42
OK pour pas thread alors...
mais pourquoi pas ce que je t'ai proposé après?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
4 avril 2009 à 16:58
Bah ce que tu me donnes, c'est un peu la mm chose que ce que je fais non?

Sa "endort" le prog pendant un certain temps, donc si tu appuies sur une touche durant cet "endormissement" l'appuie sur la touche ne sera pris en compte que lorsque le prog se réveille et refait la boucle.
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
4 avril 2009 à 18:50
sauf qu'en l'occurence tu exécutes ta boucle toutes les 20 millisecondes et pas toutes les secondes...
C'est ça le truc : il faut que tu parcoures ta boucle très souvent mais tu fais l'affichage seulement toutes les secondes...ou alors dès qu'il y a une modif due à l'appui sur une touche.
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
4 avril 2009 à 19:31
Oui c'est vrai, je suis passé trop vite sur ton code. je pensais simplement que tu me demandait de réduire le tps de la boucle a 20ms.

Merci pour tes réponses, j'ai adapté à mon code et sa fonctionne.
0
Rejoignez-nous