Les objets avec love2d

Dans le chapitre précédent, nous avons utilisé les tables comme des listes numérotées mais nous pouvons stocker des valeurs d’une manière différente à savoir avec des chaînes de caractères :

1
2
3
4
5
function love.load()
  -- rect est l'abréviation de rectangle
  rect = {}
  rect["width"] = 100
end

“width” est appelé une clef ou une propriété. La table rectangle a maintenant une propriété “width” avec une valeur de 100. Nous n’avons pas besoin d’utiliser les chaînes dès que nous voulons créer une propriété. Un point (.) est le raccourci pour table_name[“propriété”]. Ajoutons quelques propriétés :

1
2
3
4
5
6
7
function love.load()
  rect = {}
  rect.x = 100
  rect.y = 100
  rect.width = 70
  rect.height = 90
end

Maintenant que nous avons nos propriétés nous pouvons commencer à dessiner le rectangle :

1
2
3
function love.draw()
  love.graphics.rectangle("line", rect.x, rect.y, rect.width, rect.height)
end

Faisons le bouger !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function love.load()
  rect = {}
  rect.x = 100
  rect.y = 100
  rect.width = 70
  rect.height = 90

  -- Ajout de la vitesse comme propriété
  rect.speed = 100
end

function love.update(dt)
  rect.x = rect.x + rect.speed * dt
end

Maintenant, nous avons un rectangle qui bouge de nouveau mais pour montrer la puissance des tables je vais créer de multiples rectangles qui bougent.
Pour ce faire, nous allons utiliser une table comme liste et nous aurons une liste de rectangles. Déplacez le code de love.load dans une nouvelle fonction et créez une nouvelle table pour love.load :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function love.load()
  -- Rappel: camelCasing!
  listOfRectangles = {}
end

function createRect()
  rect = {}
  rect.x = 100
  rect.y = 100
  rect.width = 70
  rect.height = 90
  rect.speed = 100

  -- Mettre le nouveau rectangle dans la liste
  table.insert(listOfRectangles, rect)
end

Maintenant, à chaque fois que nous appelons creatRect, un nouveau objet rectangle sera ajouté à notre liste. C’est bien une table remplie de table.
Faisons qu’à chaque appuie sur la touche espace, nous appelons createRect. Nous pouvons faire ça avec le callback love.keypressed :

1
2
3
4
5
6
function love.keypressed(key)
  -- Rappel: 2 signes égal (==) pour comparer!
  if key == "space" then
    createRect()
  end
end

Dès que nous appuyons sur une touche, LÖVE appellera love.keypressed et passera la touche pressée en argument. Si la touche est « espace », cela appellera createRect.

La dernière chose à faire est de changer nos fonctions update et draw. Nous devons itérer où afficher la liste des rectangles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function love.update(dt)
  for i, v in ipairs(listOfRectangles) do
    v.x = v.x + v.speed * dt
  end
end

function love.draw(dt)
  for i, v in ipairs(listOfRectangles) do
    love.graphics.rectangle("line", v.x, v.y, v.width, v.height)
  end
end

Et maintenant, si nous exécutons le jeu, un nouveau rectangle qui bouge apparaît à chaque fois que la touche espace est appuyée.

Résultat quand j’appuie sur la barre d’espace
Résultat quand j’appuie sur la barre d’espace

Encore une chose ?

Il y avait beaucoup de code dans ce petit chapitre. Je peux imaginer que vous soyez un peu dérouté alors passons en revu le code une fois de plus :

  1. Dans la fonction love.load nous créons une table appelée listOfRectangles
  2. Quand nous pressons la touche space (espace), LÖVE appelle love.keypressed et dans la fonction, nous vérifions si la touche est « space ». Si c’est le cas, nous appelons la fonction createRect.
  3. Dans createRect nous créons une nouvelle table. Nous lui donnons des propriétés comme x et y et nous la stockons dans la liste listOfRectangles
  4. Dans love.update et love.draw nous itérons cette liste de rectangles pour la mettre à jour et dessiner chaque rectangle.

Les fonctions

Un objet peut aussi avoir des fonctions. Vous créez une fonction pour un objet comme ceci :

1
2
3
function tableName.functionName()

end

Résumé

Nous pouvons stocker des valeurs dans une table mais pas seulement. Il est aussi possible de stocker des chaînes. Nous appelons ces types de table des objets.
Avoir des objets nous permets d’économiser de nombreuses variables en plus d’être plus facile à lire.