Collision avec la raquette !
Pour savoir si notre balle collisionne avec la raquette nous avons besoin de deux conditions.
- Connaître sa position en X, comparé à notre raquette
- Connaître sa position en Y, comparé à notre raquette
Si ces deux conditions sont vraies alors notre balle collisionne avec la raquette !
Collision en X
Pour connaître si la condition en X, est vraie.
Nous n’avons pas besoin de calculs, juste de deux conditions.
Voici un schéma :

- On veut savoir si la position droite de la balle est supérieure à la position gauche de la raquette.

- On veut savoir si la position gauche de la balle est inférieur à la position droite de la raquette.

Si ces deux conditions sont vraies, il a un début de collision entre notre balle et la raquette.
if balle.x + balle.w > raquette.x and balle.x < raquette.x + raquette.w then -- la collision en X est vrai ! end
Collision en Y
Pour connaître si la condition en Y, est vrai.
Nous testerons la position Y uniquement si la condition en X est vraie, ainsi on simplifie le code.
Nous n’avons pas besoin de calculs non plus, juste d’une seule condition.
- On veut savoir si la position basse de la balle est supérieure à la position haute de la raquette.

Si cette condition est aussi vraie. Alors il y a bien une collision avec notre raquette.
function love.update(dt)
if balle.x + balle.w > raquette.x and balle.x < raquette.x + raquette.w then
-- la collision en X est vrai !
if balle.y + balle.h > raquette.y then
-- collsion !
end
end
endMaintenant que nous savons s’il y a une collision. Nous devons faire repartir la balle dans l’autre sens.
Renvois de la balle
Pour faire ceci, il nous suffit de replacer la balle au-dessus de la raquette puis de changer sa direction VY.
function love.update(dt)
if balle.x + balle.w > raquette.x and balle.x < raquette.x + raquette.w then
-- la collision en X est vrai !
if balle.y + balle.h > raquette.y then
-- collsion !
-- 1 | on replace la balle juste au dessus de la raquette
balle.y = raquette.y - balle.h
-- 2 | on inverse la direction VY de la balle
balle.vy = 0 - balle.vy
end
end
endPlus qu’à ajouter ceci à notre code :
love.window.setTitle("Casse Brique")
local raquette = {x=300, y=555, w=200, h=40, speed=250}
local balle = {x=0, y=0, w=40, h=40, isGlue=true, vx=-1, vy=-1, speed=300}
local briques = {} -- nos briques
-- creation des briques
for ligne=1, 5 do
briques[ligne] = {}
for colonne=1, 6 do
briques[ligne][colonne] = 1
end
end
--
function love.update(dt)
if balle.isGlue == true then
balle.x = raquette.x + ((raquette.w / 2) - (balle.w / 2))
balle.y = raquette.y - (balle.h + 2)
elseif balle.isGlue == false then
balle.x = balle.x + (balle.vx * balle.speed * dt)
balle.y = balle.y + (balle.vy * balle.speed * dt)
end
-- la balle rebondi sur le bord droit ou gauche
if balle.x < 0 then
balle.x = 0
balle.vx = 0 - balle.vx
elseif balle.x + balle.w > 800 then
balle.x = 800 - balle.w
balle.vx = 0 - balle.vx
end
-- la balle rebondi sur le bord en haut
if balle.y < 0 then
balle.y = 0
balle.vy = 0 - balle.vy
end
-- la balle est perdue si elle a touchee le bord en bas
if balle.y + balle.h > 600 then
balle.isGlue = true
balle.vy = -1
balle.vx = -1
end
-- deplacement de la raquette Droite ou Gauche
if love.keyboard.isDown("left") then
raquette.x = raquette.x - (raquette.speed * dt)
elseif love.keyboard.isDown("right") then
raquette.x = raquette.x + (raquette.speed * dt)
end
-- limiter le deplacement de la raquette a la fenetre du jeu
if raquette.x < 0 then
raquette.x = 0
elseif raquette.x + raquette.w > 800 then
raquette.x = 800 - raquette.w
end
-- collision balle avec raquette :
-- test collision en X ?
if balle.x + balle.w > raquette.x and balle.x < raquette.x + raquette.w then
-- test collsion en Y ?
if balle.y + balle.h > raquette.y then
-- 1 | on replace la balle juste au dessus de la raquette
balle.y = raquette.y - balle.h
-- 2 | on inverse la direction VY de la balle
balle.vy = 0 - balle.vy
end
end
end
--
function love.draw()
-- notre raquette
love.graphics.rectangle("fill", raquette.x, raquette.y, raquette.w, raquette.h)
-- notre balle
love.graphics.rectangle("fill", balle.x, balle.y, balle.w, balle.h)
local x, y, w, h -- nos variables briques
x = 0
y = 0
w = 800 / 6
h = 30
for ligne=1, 5 do
for colonne=1, 6 do
love.graphics.rectangle("fill", x+1, y+1, w-2, h-2)
x = x + w -- a chaque colonne on decale notre variable x de la largeur d une brique
end
x = 0 -- on remets la position x pour la ligne suivante
y = y + h -- on decalle la position y pour la ligne suivante
end
end
function love.keypressed(key)
if key == "space" and balle.isGlue == true then
balle.isGlue = false
end
endApercu en image :
Parfait !
La balle rebondit bien sur la raquette !
Plus qu’à tester avec nos briques !