Bonjour à tous !
J'essaye de faire un petit jeu de plateforme 2d et donc j'en arrive à la gestion du temps.
J'aimerai en effet que le programme affiche 60 images/seconde (donc une toute les 16ms environ).
Mais il y a un problème : le jeu à l'air de pouvoir être stable en temps mais desfois il crash et ferme.
Je poste la fonction :
void temps(int *tempsPrecedent, char duree) //duree : duree avant la prochaine maj
{
int tempsActuel;
tempsActuel = SDL_GetTicks();
int limit = *tempsPrecedent - tempsActuel + duree; //dans l'exemple duree vaut 16
if (limit >= 16)
{
SDL_Delay(16);
}
else if (limit >= 0)
{
SDL_Delay(limit);
}
*tempsPrecedent = SDL_GetTicks();
}
Le problème vient normalement de la fonction temps car quand je la met en commentaire le prog ne bug pas.
Voila si quelqu'un voit quelque chose d'anormal dans le code merci de me le dire ![]()
il a l'air instable dès que ça commence à être fluide...
là, tu lui dis d'attendre seize millisecondes s'il s'est écoulé plus de seize ms a la frame précédente, ou d'attendre moins de seize millisecondes s'il s'est écoulé moins de temps a la frame précédente. donc, il attendra toujours moins longtemps, et ton jeu partira en vrille
a la limite, il faudrait faire un:
if(limit<16)
{
sdl_delay(16-limit);
}
mais sdl_delay, c'est pas très adapté... ca dit a ton programme de s'endormir au moins seize millisecondes, mais tout dépend en réalité du commutateur de processus, et ca donnera un jeu qui rame atrocement si on lance un autre programme un peu lourd à côté. je préfère la boucle while infinie qui fait patienter le programme jusqu'a 16 millisecondes de la précédente frame ![]()
Et puis il y a d'autres trucs a moitié louches, pourquoi "tempsPrecedent" est un pointeur? Pourquoi "duree" est un char(même si ça n'a pas tant d'importance)?
caelacanthe
Oui en effet quand on lance un autre programme lourd en même temps le jeu ram plus donc d'après toi il ne faut pas du tout utiliser sdl_delay ? Sinon merci pour ta réponse cela me permet de voir plus clair
Pocolo
tempsPrecedent est un pointeur pour pouvoir mettre à jour la variable (ici c'est "map.maj"). Mais c'est vrai que je pourrai faire un retour de variable.
Duree est un char car je me suis dit que sa valeur ne sera jamais plus grande que 255.
Voila ![]()
et bien, je ne doute pas que sdl_delay aie son utilité mais pour un jeu, on est pas supposé endormir le programme, ce afin de garder une réactivité de tous les instants ![]()
Ah et sinon pour voir précisément a quelle ligne ça plante tu devrais lancer en mode débogage.
Mais autrement toute ta fonction là c'est un peu le bordel et un peu trop complexe pour rien en plus, je t'en donnerai une meilleure si tu le souhaites.
Ok alors je vais tester sans sdl_delay voir le résultat.
Pour le débogage j'avais essayé de voir les valeurs des variables mais elles avaient l'air d'être bonnes.
Sinon je veux bien Pocolo voir ta fonction.
Merci ![]()
En dehors du main:
Uint32 startT; //pour stocker le temps au début de la boucle.
int ticks() //int qui retourne le temps écoulé.
{
return SDL_GetTicks() - startT;
}
Puis dans ta boucle:
startT = SDL_GetTicks(); //au tout début de la boucle donc.
if(ticks() < 1000/60) //a la fin de la boucle.
{
SDL_Delay((1000/60) - ticks());
}
Voila, tout simplement.
Puis si tu veux utiliser une boucle plutôt que SDL_Delay comme l'as proposé caelcanthe il te suffit de remplacer le "if" par un "while" et de supprimer ce qu'il y a dans les accolades.
Extra ta fonction : plus de lag, plus de bug et simple à comprendre ! Que du bonheur ![]()
Merci beaucoup ! ![]()
Puis si tu veux changer la limite de FPS il te suffit de changer le 60 par un autre nombre. ![]()
Oula. Ca sent le sdz ca encore. Je serais toi je calmerai la dose et je reprendrai les bases parce que tu vas faire n'importe quoi (tu l'as deja fait).
Et j'insiste encore une fois sur la necessite absolue d'ecrire des programmes en anglais pas en francais.
« je préfère la boucle while infinie qui fait patienter le programme jusqu'a 16 millisecondes de la précédente frame »
j'ai tendance à tiquer là dessus. C'est TOUJOURS mauvais de faire calculer un programme dans le vent.
« 1000/60 »
là aussi je tique. ce n'est pas la même chose que « 1000./60. », attention !
"Et j'insiste encore une fois sur la necessite absolue d'ecrire des programmes en anglais pas en francais."
pourquoi, au fait? a part qu'un code en français, c'est suffisament différent de ce qui se fait d'habitude que c'en est déroutant et moche
je sais, j'utilise cette solution, aussi laide soit-elle, à défaut d'une alternative. tu en connais une, d'ailleurs? a part endormir le programme et se faire préempter à mort. je suis preneur ![]()
"c'est tellement* différent" ![]()
"
pourquoi, au fait? "
C'est vrai que je ne vois pas non plus en quoi c'est une nécessité ABSOLUE. Je code en anglais parce-que je fait tout en anglais sur mon PC et que ça colle mieux avec les keywords mais a part ça je ne vois pas le problème d’écrire des trucs en français. ![]()
ça fait des noms de fonctions moins longs, aussi?
"getValue" "setValue"
"recupereValeur" (sans accents!
), "attribueValeur" ![]()
"Hello World!" ==> "Bonjour Monde!", deux caractères en plus, y'a pas a dire c'est le mal de coder en français. ![]()
« tu en connais une, d'ailleurs ? »
heu, sdl_delay() ?
Plus sérieusement, je ne me suis jamais posé cette question dans le cadre d'un jeu. En fait, je me suis posé cette question uniquement dans le caSDL_GetTicks()dre de nachos ( http://www.cs.washington.edu/homes/tom/nachos/ ) et où mettre un while() à la place d'un sleep() est synonyme d'échec cuisant.
À la limite, peut-être qu'un couplage SDL_GetTicks() + usleep() fait l'affaire, tout simplement.
Sinon, moi je suis pour le code en anglais … et pour l'algorithmique en français. D'abord on pose ses idées, les variables qu'on va utiliser avec leur type, etc. en français. Et ensuite on traduit le tout en <insérer ici votre langage de prog favori> + anglais.
L'intérêt de changer de langue entre algorithmique et programmation permet de olus facilement séparer ces deux étapes de la conception d'un code, chose que les gens ne font pas beaucoup en pratique, et on voit ce que ça donne…
PS: c'est quoi l'équivalent windowsien du usleep() ?
dans le cadre* de nachos
Problème de copier-coller (enfin, d'interface chaise-souris pour être franc). ![]()
"PS: c'est quoi l'équivalent windowsien du usleep() ?"
on a une fonction Sleep, qui prend des millisecondes en paramètre... mais sdl_delay fait peut-être plus de choses, ils doivent avoir des threads à stopper aussi
usleep freeze le programme pendant une durée précise?