Je débute en C et après avoir fait l'excellent tuto de Mateo21 je me suis dit qu'un bon entraînement pour aller plus loin serait de refaire un vieux jeu en 2D sur SNES, les sprites étant faciles à trouver. Le problème que je rencontre est que je n'arrive pas à faire en sorte que la boucle principale ne soit bouclée que 50 fois par seconde avec un sleep sans entraver mon SDL_PollEvent qui gère les événements clavier.
Je cherche à exécuter cette boucle 50 fois par seconde pour respecter les changements de sprites pour faire l'animation, peut-être que je m'y prends mal et qu'il y a d'autres méthodes.
Voici un extrait du code :
int continuer = 1;
while (continuer)
{
//animations changeant en fonction d'un compteur dans la boucle
SDL_PollEvent(&event);
switch (event.type)
{
//événements clavier
}
sleep(20);
}
Avec ce sleep je ne peux pas interagir car forcément ca dort pendant le gros de l'exécution, mais sans ca, la boucle tourne à toute vitesse et bouffe le processeur, comment je peux faire ?
Je pense que tu as élaboré une théorie sans même avoir fait l'essai. Tout le monde utilise ce système sans pour autant avoir de problème avec la gestions des événements puisque la pile d'évent est alimentée même lorsque le le programme est en pause.
Ton problème vient surtout d'une mauvaise utilisation du dépilage qui devrait ressembler à quelque chose comme ça :
while (SDL_PollEvent(&event))
{
switch (event.type)
{
...
}
}
Ceci permettant donc de parcourir toute la pile d'événement sur un même cycle programme. Je t'invite à aller voir ce tuto.
Également il serait préférable d'utiliser SDL_Delay() plutôt qu'un sleep(), histoire d'être standard.
De plus pour avoir un taux de fps constant, il faut tenir compte du temps d'exécution du code qu'il faut déduire de tes 20ms avec un truc qui ressemble à ça en fin de boucle :
Pour ce qui est d'avoir des animations avec des intervalles d'images corrects, il suffit de faire en sorte que ces animations ne dépendent pas de la vitesse de cycle du programme et devraient donc posséder leur propre synchronisation.
Merci pour ta réponse, en effet je suis parti du mauvais pied. Du coup pour les animations tu penses à l'utilisation de SDL_AddTimer ? C'est vrai que déjà ca rendra la fonction plus propre. Je vais me pencher sur tout ca merci encore
non, je ne pense pas à SDL_AddTimer, un simple comparateur fait l'affaire :
now = SDL_GetTicks()
if (now-prevTime >= 100)//si au moins 100ms
{
actPic = (actPic+1)%numOfPic; //image suivante modulo nombre d'image pour boucler
prevTime = now; //memoriser temps actuel pour comparaison suivante
}
× 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.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.