Je sais, je sais, même si la référence à l’expression « Le temps, c’est de l’argent » est foireuse, il n’en est pas moins un concept important à connaître, surtout quand des outils comme Construct 2 permettent son exploitation très…..simplement…Alors vous êtes prêts pour cette courte séance ?….
Un peu d’histoire…
Evidemment, avant de comprendre comment s’en servir il serait bien de savoir à quoi cela correspond exactement. Loin de moi de vous faire croire que je suis un savant qui sait tout, je vous rassure, c’est pas le cas du tout et je ne parlerai que de ce que je pense savoir 🙂
Revenons quelques bonnes années en arrières, mais loin, bien loin. En plus cela tombe bien, cela colle parfaitement au challenge du moment 😀
Avez vous déjà essayé de faire tourner un jeu, vieux, voir très vieux, sur votre Pc flambant neuf ? Bon je l’admet pour ce faire il faut bidouiller, car il est rare de nos jours d’avoir un PC « compatible » avec les jeux d’antan. Si vous êtes de ces chanceux qui ont eu la joie de pouvoir tester, vous aurez remarqué que pour certains d’entre eux (pas tous, tout dépend à quand ils ont été faits), sont….injouables car beaucoup trop rapide !
Cela vient du fait que ces jeux ont été programmés sans prendre en considération la puissance des machines. il faut dire qu’à l’époque les machines étaient quasiment presque toutes équivalentes. Jusqu’à un certains moment où le problème s’est fait ressentir.
Les programmeurs avaient recours à différents artifices dont le Vsync, on va pas faire un exposé des différentes manières qui existent mais il faut savoir qu’aujourd’hui, le problème est réglé d’une manière très simple : via le delta time.
Le delta Time c’est quoi ?
Delta cela signifie « différence ». Time c’est le « temps » : Différence ce temps, voilà qui devient intéressant. En fait le Delta Time est le temps qui s’est écoulé depuis le dernier « tick ». Si on prend en considération qu’un jeu doit tourner à 60 fps, donc 60 images par secondes, cela veut dire qu’il y a 60 ticks pour faire 1 seconde. Ce qui signifie aussi, que le Delta Time aura une valeur de 1 au bout d’une seconde, 2 au bout de 2 etc…Le Deta time étant le temps écoulé entre chaque tick, mis bout à bout, la valeur doit à 1 seconde de temps être égale à 1.
Reprenons l’exemple de tout à l’heure avec un exemple concret. Admettons que j’ai 2 PC, PC1 qui tourne à 30 fps par sa vitesse d’execution, et un autre, PC2, meilleur qui me propose du 60 fps. Je fais un sprite qui avance de 1 pixel à chaque tick.
Sur le PC1, cela veut dire que au bout d’une seconde, mon sprite se sera déplacé de 30 pixels.
Sur le PC2, au bout d’une seconde mon sprite se sera déplacé de….60 pixels.
Vous voyez le problème ? les deux PC ne tournent pas à la même vitesse, ce qui peut rendre sur les pc les plus rapides, injouables car trop rapide ! Alors que faire ?
Le Delta Time bien sur !
Maintenant faisons la même chose en appliquant le facteur temps, c’est à dire qu’on va bouger notre sprite en fonction du temps écoulé entre deux ticks. Cela veut dire que je vais multiplier les déplacements de mon sprite par le delta-time. Ainsi à chaque tick, ce delta sera pris en compte dans le déplacement.
Prenons un exemple concret. Je veux déplacer à chaque tick un sprite de 1 pixels de manière à ce que mon sprite se déplace de 60 pixels par seconde, ce qui donne ceci.
Every Tick => sprite.x = sprite.x + 1
Petit rappel de la section précédente :
Sur le PC 1 qui tourne à 30 images secondes, cela signifie qu’en 1 seconde il aura parcouru 30 pixels (soit 30 * 1).
Sur le PC 2 qui tourne à 60 images secondes, le sprite aura parcouru 60 pixels !, soit deux fois plus vite (60*1), et donc j’arrive à mes fins car le pc est assez puissant pour faire ce que je veux.
Cependant j’ai pas pensé aux PCs moins puissants ce qui fait que sur ceux là il faudra donc 2 secondes (soit deux fois plus de temps pour parcourir la même distance). C’est ce que nous avons vu dans la section précédente.
Appliquons maintenant le Delta Time :
Every Tick => sprite.x = sprite.x + 60 * dt
dt c’est le Delta Time. Nous savons que le delta time est égal à 1 toutes les secondes car la somme des deltas times (la sommes des temps écoulés entre chaque tick), doit forcément être à 1, à chaque seconde, comme le temps finalement.
Sur le PC1, à 30 frames par seconde, si on fait le calcul, cela veut dire que le sprite avancera de 60 pixels toutes les secondes. Et bien oui puisque dt est égal à 1 toutes les secondes, on vient de le voir, 60 * 1 ca fait bien 60. Et en 0,5 seconde, le sprite aura avancé de 30 pixels (60*0.5).
La différence se joue en fait entre chaque tick, la valeur du dt est légèrement différente à chaque fois. Le fait de multiplier par cette valeur assure un fonctionnement identique du jeu quelque soit la machine.
Et c’est pareil sur le PC 2, au final. Dans ce cas on se moque de la puisance du PC. On dit juste « je veux que le sprite se déplace de x pixels toutes les secondes quelque soit la vitesse du pc. Cela évite le problème des jeux trop rapides ou trop lents. On prend en somme le problème à l’envers au lieu de dire, je veux avancer de x pixels à chaque tick, on dit plutôt qu’en une seconde de temps, il faut que mon sprite aie avancé de x pixel, comme cela on met tout le monde d’accord 🙂
Et cela se vérifie par les calculs, nous allons le faire pour le PC à 30 frames par seconde. Reprenons :
Every Ticks => sprite.x = sprite.x + 60 * dt
On est d’accord que à 1 seconde, dt = 1 donc en une seconde mon sprite aura parcouru 60 pixels. Qu’en est t-il à chaque tick ? très simple vu que le PC tourne à 30 frames / seconde, cela veut dire que 1 tick équivaut en temps à 1/30ème soit 0.033.
Donc chaque tick mon sprite parcours 60 * 0.033 (suffit de reprendre la condition ci dessus).
Cela fait 1.980 par tick. Multipliez ceci par 30 maintenant (vu qu’il y a 30 frames par seconde dans ce cas ci) ca fait combien ? : 59.4 ! victoire on est bien à 60 pixels en une seconde. La variation s’explique par le facteur temps qui varie entre chaque tick, donc notre calcul fait comme cela n’est pas exactement précis.
Vous pouvez faire le calcul avec le PC 2 qui marche à 60 frames par seconde, ca marche pareil, vous tomberez toujours sur un résultat de 60 au bout d’une seconde. Et c’est même plus facile, vu qu’il tourne à 60 frames seconde, et bien à 1 tick il sera à 1/60ème, si vous faites le même calcul il avancera de 1 pixel tous les ticks pour arriver à 60 pixels à 1 seconde.
Sous Construct 2
C’est exactement ce qu’on vient de voir, il y a la variable dt qui fait ce travail, il suffit donc de multiplier les déplacement par dt et c’est gagné.
Cependant Construct 2 nous facilite la vie et on a pas de calcul fastidieux à faire. Car en réalité c’est pas si simple, il faut calculer soit même son delta time, en fonction du temps entre chaque tour de boucle principal du jeu avec des variables, et faire la différence nous même. Là tout est fait pour nous, on a juste à s’en servir.
Alors pourquoi s’en priver ? Vous serez sur d’avoir une vitesse de jeu fluide et identique partout !