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
end

Maintenant 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
end

Plus 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
end

Apercu en image :

Parfait !

La balle rebondit bien sur la raquette !


Plus qu’à tester avec nos briques !