Bonjour,
J'ai réalisé aujourd'hui un exercice de physique visant à calculer la trajectoire de la balle dans un référentiel terrestre (et donc galiléen). Je me suis dit qu'il serait amusant de créer un simulateur de lancer de balle grâce à un moteur de jeu. Mon choix c'est porté sur mon nouveau jouet, LÖVE. Voici mon fichier qui gère les mouvements de la balle :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | function init_ball() ball = { radius = 10, velocity = { x = 100, y = 100 }, color = { 255, 255, 255 } } ball.position = { x = ball.radius, y = game.height - ball.radius, start = {} -- Position de la balle quand l'utilisateur presse space (pour savoir à quelle hauteur la balle est lancée) } end -- Bouge manuellement la balle sur l'axe des y, si la barre espace est pressée, on met le jeu sur start empêchant tout déplacement manuel de la balle function move_ball(dt) if love.keyboard.isDown("up") or love.keyboard.isDown("z") then ball.position.y = ball.position.y - (ball.velocity.y * dt) end if love.keyboard.isDown("down") or love.keyboard.isDown("s") then ball.position.y = ball.position.y + (ball.velocity.y * dt) end if love.keyboard.isDown("space") then ball.position.start.y = ball.position.y -- On sauvegarde la position de la balle avant de la lancer game.start = true end end -- Calcule la nouvelle position de la balle une fois la simulation lancée function throw_ball(dt) ball.position.x = ball.position.x + (ball.velocity.x * dt) ball.position.y = ball.position.y - (-0.5 * game.constants.g * (ball.position.x/(ball.velocity.x * dt))^2 + ball.position.start.y) end -- Empêche la balle de sortir de l'écran function block_ball() if (ball.position.y - ball.radius) < 0 then ball.position.y = ball.radius elseif (ball.position.y + ball.radius) > game.height then ball.position.y = game.height - ball.radius end end -- Calcule la position de la balle function update_ball(dt) if game.start then -- On ne calcule la position de la balle qui si l'utilisateur à appuyé sur "space" (la variable game.start passe alors à true) throw_ball(dt) else -- Sinon on autorise l'utilisateur à placer manuellement la balle le long de l'axe y move_ball(dt) end block_ball() -- On empêche la balle de sortir du cadre end -- Dessine la balle function draw_ball() love.graphics.setColor(ball.color) love.graphics.circle("fill", ball.position.x, ball.position.y, ball.radius, 64) end |
Dès que je presse space
, la balle entame un mouvement très rapide (j'ai du filmer mon écran et passer la vidéo au ralenti pour voir ce mouvement) vers le haut et redescend à la même vitesse vers le bas puis elle slide sur cet axe (dû à la fonction block_ball()
).
Soit le mouvement est tellement infime qu'il faudrait que je zoom pour pouvoir le voir où alors il y a quelque chose qui m'échappe. En tout cas, merci de votre aide!
PS : l'équation paramétrique horaire que j'ai calculé dans mon exercice pour calculer la position de la balle est celle-ci :
Avec :
- $g$ la constante de pesanteur : 9.80665
- $v_0$ la vitesse initiale de la balle (ici 100 :
ball.velocity.x
) - $H$ la hauteur de lancer de la balle (
ball.position.start.y
)