Bien le bonjour à tous, je me suis remit à Gdevelop un peu, et c’est un peu la galère, j’ai surtout des problèmes à comprendre le système de gravité de Gdevelop.
la formule pour calculer la hauteur H d’un saut avec un comportement type plateforme est:
H = (Vitesse de saut^2)/(2Gravité) //formule calculée par moi-même via l’équation d’une parabole ( Y=0.5gravitétempsrelatif^2 - Vitessedesauttempsrelatif+ InitialY ) et vérifiée dans d’autres moteurs de jeux
avec une gravité de 1000 et une vitesse de saut de 438.18, je devrait pouvoir sauter de 96 pixels (légèrement plus), or après test il semblerait que je ne saute que de 48 pixels, soit la moitié.
Pourquoi cette étrangeté? la gravité serait-elle divisée/multipliée par deux là où il ne faut pas?
Merci d’avance pour les éventuels commentaires sur ce phénomène plus que étrange.
GDevelop n’utilise pas l’équation de la parabole directement mais fait juste ceci à chaque “frame” :
vitesseY = vitesseSaut - gravite * temps
PUIS
positionY = positionYInitiale + vitesseY * temps = positionYInitiale + vitesseSaut * temps - gravite * temps²
Voilà donc l’équation qu’utilise GDevelop car, pour déplacer l’objet, il se contente de multiple la vitesseY par le temps. Ce n’est pas faux en soit si on ne creuse pas plus loin. Mais vu que la vitesseY varie pendant la frame (avec l’accélération de la gravité), la multiplier par le temps n’est pas correct car il faudrait l’intégrer par le temps pour être juste. On obtiendrait d’ailleurs :
Et on observe bien la différence car il y a un facteur 2 qui divise l’accélération de la gravité dans l’équation, ce qui n’est pas le cas quand on approxime l’intégrale en multipliant juste la vitesseY “finale” par le temps.
Je ne dirai pas que c’est un bug. C’est juste une simplification qui permet de calculer les choses beaucoup plus vite qu’en ayant à intégrer la vitesse à chaque fois.
or justement la gravité se défini comme la variation de la vitesse instantanée, qui elle même est la variation de la position instantanée, c’est donc la dérivée seconde de la position instantanée, or si on dérive deux fois ici, on obtient
positionY’ = vitesseSaut -2gravitetemps
positionY’’=-2*gravite
du coup le paramètre que l’on règle n’est pas la gravité mais la double gravité (ou demi gravité, je sais plus) si on veut être correct, autant appeler les choses comme elles sont (je sais je suis énervant) vu que derrière ça peut changer le résultat du tout au tout (une hauteur de saut deux fois moins grande que dans d’autres moteurs, une incohérence avec les équations pour calculer la durée et la hauteur du saut, des portages d’un moteur a un autre plus fastidieux, etc…).
un quickfix serait de renommé en" double (ou demi) gravité" le paramètre je pense.
C’est justement ce que j’ai dit sur le fait qu’il y a un facteur 2 (hormis que je n’ai pas nommé la chose “demi-gravité”). Le comportement Plateforme ne vise pas à être une reproduction exacte de la physique (contrairement au moteur physique).
a prendre avec des pincettes bien sûr, mais ça devrait aider certains à régler leurs sauts plus ou moins de manière approchée.
VitesseDeSaut et ParamètreGravité étant réglés dans gdevelop sous les noms Vitesse de saut et Gravité, HauteurDeSaut est la hauteur du saut en pixels, et DuréeDélévation la durée d’élévation durant le saut (avant que on redescende quoi) en secondes si les unités de Vitesse de saut est le pixel / seconde et de gravité le pixel / (secondes^2)