Shot prediction

Sur la plupart des jeux que j’ai fait (Chilly greens, Golf madness, Poooooool), j’ai de la prédiction de tir. Ça peut aller du simple trait tout droit comme dans Gold madness (fig1), ou sur de la prédiction physique comme dans Chilly Greens (fig2), ou un mix entre prédiction mathématique et du stepping – si ça s’appelle comme ça – ce que je fais actuellement sur Poooooool (fig3)

fig1 – Golf madness : Easiest prediction
fig2 – Chilly Greens : Physics prediction
fig3 : Poooooool : Maths prediction

Les bases

Pour la prediction de golf madness, rien de plus simple. Quand l’utilisateur mouse down, j’enregistre la position, puis à chaque frame dans la function _process je regarde la position de la souris et je fais un calcul de vecteur avec V2 – V1 qui me donne le vecteur de direction.

Je peux ensuite en fonction de la taille de ce vecteur et la direction, dessiner un trait avec la fonction draw qui part de la balle dans la bonne direction et de la bonne taille.

Chilly Greens

Pour Chilly Greens, ma première approche a été d’essayer de faire ça mathématiquement, mais je n’ai jamais réussi à rendre ça fiable. J’avais toujours des décalages dû à la friction, et des manques de précisions en général.

Heureusement j’ai pu utiliser la fonction move_and_collide de Godot qui a un paramètre test_only. C’était déjà ce que j’utilisais pour la physique de la balle, donc avec un test_only je pouvais récupérer la trajectoire de la balle et la redessiner point par point en 3D (avec des cylindres)

Une réussite instantanée :

Je suis passé par beaucoup d’étapes pour rendre ca viable et agréable. Mais j’adore le résultat. Pour faire simple au final, je récupère à chaque itération du move_and_collide la position de la balle. Je crée ainsi une trajectoire mais qui est basé sur la vitesse de la balle. Plus la balle va vite plus il y a de distance entre chaque frame. Donc une fois que j’ai récupéré la trajectoire globale. Je la redécoupe en par égale pour avoir une prediction plus esthétique.

Poooooool ou Pythagore

Pour Poooooool c’était une autre histoire. J’utilise la physique du moteur Godot, donc sans move_and_collide, il fallait que je trouve une autre solution.

Je suis tout d’abord passé par de l’itération. J’ai la prédiction de la direction de mon coup grâce à la position de la queue sur le tapis. Donc ça c’est facile. Il me reste plus que partir de la boule blanche et me déplaçait de quelques pixels dans cette direction. Je vérifie s’il y a un contact et je continue comme ça pendant 50, 100, 150 itérations en fonction de la longueur voulue de ma prédiction. Si je trouve un contact, je stop la fonction, je recule d’une itération et je refais pareil mais cette fois-ci avec une itération de distance 10 fois moins grande que la précédente, jusqu’à retrouver le contact. Je refais ça avec une distance encore 10 fois moins grande, et la précision commence à devenir correct. Voila plus qu’à faire ça à chaque frame et on est bon. Je l’accorde, c’est pas la solution la plus intelligente ou jolie, mais elle fonctionne et je l’utilise toujours dans certains cas spécifiques aujourd’hui.

Mais quand même je voulais trouver une solution mathématique à ce problème.