Déplacer la balle !

Passons à notre balle maintenant.

Pour savoir si la balle doit suivre la raquette ou se déplacer, il va nous falloir une variable. Une variable de type booléen fera parfaitement l’affaire.

Nous lui donnerons une Vélocitée en X et une Vélocitée en Y.

Ainsi qu’une variable vitesse.

  • On nommera notre variable booléenne isGlue.
  • Ajouter les variables de vélocités, vx et vy.
  • Ajouter la variable speed.
local balle = {x=0, y=0, w=40, h=40, isGlue=true, vx=-1, vy=-1, speed=300}

il faut aussi modifier l’update de la balle pour savoir si elle doit suivre la raquette ou bien etre en mouvement avec ses vélocités :

function love.update(dt)
  	-- la balle suit la raquette si isGlue est a true
	if balle.isGlue == true then
		balle.x = raquette.x + ((raquette.w / 2) - (balle.w / 2))
		balle.y = raquette.y - (balle.h +  2)
    else
		balle.x = balle.x + (balle.vx * balle.speed * dt)
		balle.y = balle.y + (balle.vy * balle.speed * dt)
    end
end

Tout comme la raquette il faut limiter la balle a la fenêtre du jeu, mais nous voulons qu’elle change de direction aussi.

  • Bord gauche : Replacer x et Changer de direction vx
  • Bord Droite : Replacer x et Changer de direction vx
  • Bord Haut : Replacer y et Changer de direction vy
  • Bord Bas : Remettre isGlue à true et réinitialisés les valeurs de vx et vy à leurs valeurs initiales
function love.update(dt)
  	-- la balle suit la raquette si isGlue est a true
	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
end

Maintenant, il nous faut créer un événement déclencheur pour que notre balle change son booléen isGLue à false.

On utilisera l’événement suivant :
Si on presse la touche espace et que balle.siGlue est bien a true Alors balle.isGlue vaudra false Fin

function love.keypressed(key)
  if key == "space" and balle.isGlue == true then
    balle.isGlue = false
  end
end

Désormais votre balle doit rebondir sur les murs et revenir sur la raquette lorsqu’elle touche le bord bas de l’écran.

Voici le code complet :

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

Il ne nous reste plus que les collisions à gérer.

  • Collision entre la balle et la raquette
  • Collision entre la balle et les briques