cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDernière intervention 1 novembre 2011
-
4 avril 2009 à 13:30
cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDerniè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));
}
}
A voir également:
Pour que mes touches soient détectées immédiatement
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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 :
cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDerniè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.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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.