Solution Renvois de vélocité (simple) :

  Si vous avez réussi Bravo ! Regardons ensemble la solution suivante :  

local Objet = {x=300, y=250, w=200, h=100, vx=500, vy=120}

function Objet.update(dt)

  -- Déplacement de l'Objet :
  Objet.x = Objet.x + (Objet.vx * dt) 
  Objet.y = Objet.y + (Objet.vy * dt)


  -- Rebonds sur les Bords Gauche et Droit de L'écran :
  if Objet.x + Objet.w >= love.graphics.getWidth() then
    -- rebond de Droite
    Objet.vx = 0 - Objet.vx
  elseif Objet.x <= 0 then
    -- rebond de Gauche
    Objet.vx = 0 - Objet.vx
  end

  -- Rebonds sur les Bords Haut et Bas de L'écran :
  if Objet.y + Objet.h >= love.graphics.getHeight() then
    -- rebond du Bas
    Objet.vy = 0 - Objet.vy
  elseif Objet.y <= 0 then
    -- rebond du Haut
    Objet.vy = 0 - Objet.vy
  end

end

function Objet.draw()
  love.graphics.rectangle("fill", Objet.x, Objet.y, Objet.w, Objet.h)
end

function love.update(dt)
  Objet.update(dt)
end

function love.draw()
  Objet.draw()
end

  Rendu (avec rajout de colorisation lors des rebonds) :   Cool ça Fonctionne !  

Il reste cependant un problème !

  La solution est incomplète et il reste un problème encore, lequel et pourquoi ?  

Lequel ?

Si l’on met une vélocité trop grande, notre Objet sortira de la fenêtre et ne reviendra pas !   Essayez avec une Vélocité X  ou Y supérieur à 10 000 ou plus !

Avec une vélocité à 10000 (L’Objet sort littéralement de la fenêtre) :

Avec une vélocité à 5000 (L’Objet reste coincé dans le rebord) :

Pourquoi ?

Lors du déplacement notre Objet, se déplace d’une quantité en pixel par seconde.

Prenons l’exemple avec une vélocité de 10 000

La formule pour connaitre le nombre de pixels parcourus par update de notre Objet :

velocité * dt = pixels par update

Exemple d’un Object avec une vélocité à 10 000 et d’un DeltaTime fixé a 60 FPS :

10000 * 0.012 = 120 pixels/update

Pourquoi c’est un problème ?

L’objet se déplace d’un nombre de pixels en fonction de la valeur du DeltaTime (dt).

Donc la valeur d’un Objet de pixels/update n’est pas fixe !

Si l’objet sort et ne refait pas le chemin inverse pour revenir dans la fenêtre, il restera alors coincé à l’extérieur à tout jamais !

Exemple et explication de cette situation

Schéma reprenant le cycle du jeu :

Au début, au load (on n’applique pas encore la vélocité), puis viens le cycle des updates !

L’Objet se déplace alorrs d’une valeur en pixel qui est dépendante du DeltaTime, cette valeur est donc plus ou moins grande a chaque update !

Lorsque l’Objet touche ou est en dehors de l’écran, l’opposition de sa vélocité est bien appliquée !

Cependant, la distance qu’il parcourt ensuite ne lui permet pas forcément de rejoindre l’écran !

Dans l’update 6, l’Objet ne sera plus jamais visible à l’écran, car celui-ci devrait parcourir deux fois la distance pour revenir dans l’écran…  

Comment résoudre le problème ?

Heureusement, la solution a ce problème est assez simple à résoudre !

Lorsque l’Objet touche un des bords, il nous faut simplement le replacer contre le bord en question !

Ps : On n’oublie pas d’opposer sa vélocité pour le prochain update !

Pseudo code :

Si l'Objet touche le bord Gauche de la fenêtre ALORS
	- 1. Je replace l'object contre le bord Gauche     
	- 2. J'oppose sa vélocité 
FIN

Solution finale avec Renvois de vélocité et Replacement de l’Objet :

local Objet = {x=300, y=250, w=200, h=100, vx=10000, vy=120}

function Objet.update(dt)

  -- Déplacement de l'Objet :
  Objet.x = Objet.x + (Objet.vx * dt) 
  Objet.y = Objet.y + (Objet.vy * dt)


  -- Rebonds sur les Bords Gauche et Droit de L'écran :
  if Objet.x + Objet.w >= love.graphics.getWidth() then
    -- rebond de Droite
    Objet.x = love.graphics.getWidth() - Objet.w
    Objet.vx = 0 - Objet.vx
  elseif Objet.x <= 0 then
    -- rebond de Gauche
    Objet.x = 0
    Objet.vx = 0 - Objet.vx
  end

  -- Rebonds sur les Bords Haut et Bas de L'écran :
  if Objet.y + Objet.h >= love.graphics.getHeight() then
    -- rebond du Bas
    Objet.y = love.graphics.getHeight() - Objet.h
    Objet.vy = 0 - Objet.vy
  elseif Objet.y <= 0 then
    -- rebond du Haut
    Objet.y = 0
    Objet.vy = 0 - Objet.vy
  end

end

function Objet.draw()
  love.graphics.rectangle("fill", Objet.x, Objet.y, Objet.w, Objet.h)
end

function love.update(dt)
  Objet.update(dt)
end

function love.draw()
  Objet.draw()
end

  Rendu avec Replacement et une vélocité à 10 000 :  

IMPORTANT ! Conseil à RETENIR

Toujours bien replacer vos objets après opposition de vélocité (ou de collisions), ça vous évitera beaucoup de bugs semblables à l’avenir !