[C++] un jeu de basket

drizzt -  
 SKZ81 -
Bonjour tlm,

je dois programmer un jeu de basket en C++ pour un projet d'études (donc pas beaucoup de libertés dans le projet)...

j'ai dejà entamé et réalisé la majeure partie du programme mais je suis maintenant bloqué en ce qui concerne la trajectoire de la balle !

voila ce que dit le sujet, en sachant que la puissance et l'angle de tir sont définis par le joueur :

Trajectoire de la balle :
Celle-ci va être calculée de manière simple en utilisant les vecteurs vitesse et accélération.
Lorsque la balle est lancée, elle a un vecteur vitesse initial (la puissance donne la longueur et l'angle donne l'orientation).
La physique nous dit qu'à chaque unité de temps, la vitesse de l'objet est modifiée en lui ajoutant le vecteur accélération.
Comme la balle est uniquement soumise à la force de gravité, son accélération est un vecteur constant, vertical (vers la bas) et d'intensité 9,8.
Finalement, la position de la balle est modifiée en lui ajoutant le nouveau vecteur vitesse.
Comme il y a peu de calculs à effectuer entre chaque mise à jour, la séquence d'affichage risque d'être trop rapide pour que l'on ait le temps de voir quelque chose à l'écran. Il faudra sans doute que vous ajoutiez une temporisation fictive entre chaque mise à jour pour que le joueur ait le temps de voir la trajectoire de sa balle comme si celle-ci se déroulait en temps réel (n'hésitez pas à faire des tests pour régler cette temporisation).

J'ai essayé plusieurs formules mathématiques dans une fonction qui doit mettre a jour la position de la balle par unité de temps, mais sans succès : soit la balle prennait une mauvaise trajectoire, soit elle ne redescendait pas...

Si des personnes voient quelle formule il faudrait appliquer aux coordonnées de la balle, je vous remercie par avance de votre aide :)
A voir également:

3 réponses

SKZ81
 
Deux solution. Tu peux tenter de calculer la parabole qui passe par l'origine, (le lanceur) et qui est tangente au vecteur de lancé, et dont l'amplitude (la hauteur) dépend (proportionnellement) de la longueur de ce vecteur.

Deusième solution, plus proche de l'énoncé, est l'intégration numérique des équa-diffs (type Euleur ou Runge-Kutta) des équa-diff qui régissent la trajectoire de la balle.
Càd :
dp/dt = v
dv/dt = a
a = g = -9.8z m.s-2

(NB : ici z, dans -9.8z sert à dire que l'équation ne s'applique que à la coordonnée "vers le haut", avec le "-" ça fait "vers le bas". Attention au fait que les coordonnées des repères mathématiques classique (direct, croissant vers le haut et la droite) et celles de l'écran (indirectes : croissantes vers le bas et la droite)... Ben sont inversées)

Où p est le vecteur position et v le vecteur vitesse. Chaque équation se développe simplement en remplacant le vecteur par CHACUNE des composante du-dit vecteur.

Ensuite... Ces équations ne peuvent pas être traitée telle quel (puisque dt tend vers zéro, ce qui impossible à réaliser en informatique !!). On suppose alors que dt est le "pas de temps", petit intervalle de temps, typiquement entre deux image succéssives. (Une solution plus fine et applicable dans ton cas : Si 1/25 s est l'intervalle de temps entre chaque image, tu effectue, disons, 20 calcul entre chaque image, alors dt=1/(20x25)=1/500. Comme tu n'a que le balon, cela restera TRES rapide !! Mais beaucoup plus précis, surtout pour des lancer avec une grande force...)

Bref, une fois fixé "dt", un "petit intervalle de temps" (comme je disais, le plus petit possible), que doit-on faire ? Intégrer.
Càd : retrouver le "dx" étant donné le dt et l'équation "dx/dt = ..."

Intégration type Euler :

- Etape 1 :
soit v = (vx, vz) (je suppose que tu es en 2D)

dv/dt = g // equation d'accélération
=>
vx(t) = vx(t-dt) // la vitesse en x reste statique
vy(t) = vy(t-dt) + g*dt

- Etape 2 : même chose pour p
p = (px, py)

dp/dt = v
=>
px(t) = px(t-1) + vx(t)*dt // idem pour y.

NB : t-1 ou t-dt, ça revient au même. Dans le premier cas, t est un entier (numéro de cycle de calcul), dans le second, t est continu (valeur de temps).
Mais informatiquement, c'est "du pareil au même !!)

Discussion : doit-on choisir d'utiliser, dans l'équation précédente, v(t) ou v(t-1) ???
D'un point de vu "logique", v(t) représente la vitesse au temps t, il me semble normal de l'utiliser pour calculer p(t). Ceci dis, ce point précis reste discutable...

Pratiquement, à t=0, du aura du mal à utiliser v(t-dt), puisqu'inconnu (même si c'est pas infasable, mais ça demande, pour ce cas précis, d'inverser les équation ci dessus, pour, au lieu de progresser dans le temps, de regresser...)
0
Drizzt
 
Merci pour ton aide SKZ81, j'ai testé la derniere équation dans la fonction de mise à jour, et ça marche !! La balle part enfin comme il faut avec une trajectoire parabolique :)

Me reste plus qu'à traiter les collisions et mon projet sera terminé, ouf ! Encore merci à toi !
0
SKZ81
 
Toujours plaisant d'être remercié.

Mais surtout, toujours gratifiant de savoir qu'on est utile !!!
Bon courage pour finir.
0