Comprendre la GameLoop !
Le cycle d’exécution
Le cycle d’exécution, c’est l’ordre dans lesquels est interprété votre code.
Sans boucles infinies (while) votre jeu ne pourrait pas fonctionner, car le code serait exécuté, une fois puis le programme aurait terminé sa tâche.
La GameLoop
La GameLoop c’est un cycle d’exécution qui a un ordre bien défini, souvent indiquer clairement dans la documentation de votre Moteur ou de votre Framework.
Généralement, on retrouve cette ordre-ci :
- Load()
- Update()
- Draw()
Le Load() charge les variables et les ressources nécessaires au jeu pour fonctionner
L’Update() lui s’occupe de mettre à jour vos variables (déplacements, statut, etc.)
Le Draw() dessine les ressources graphiques après la mise à jour des déplacements effectués dans l’update().
Cet ordre indique donc votre GameLoop.
La GameLoop dans Love2D


Hero = {}
Hero.vie = 100
function love.load() -- exécuté une seule fois !
end
function love.update(dt) -- boucle infini
-- s'éxécute toujours avant love.draw()
end
function love.draw() -- boucle infini
-- permet l'affichage dans la fenetre
endVoyons ensemble un schéma pour comprendre le cycle de fonctionnement de Love2D.
Schéma de lecture de votre fichier main.lua, interpréter par Love2D :
- Le fichier main.lua est d’abord interprété comme un fichier lua, traditionnel, puis les exécutions de Love2D sont effectués.
- love.load() sert à charger les premières instructions, ainsi on est sûr qu’elles seront exécutées en premier et dans l’ordre établi qu’on aura choisi.
- love.update() et love.draw() sont des boucles While, elles attendent l’évènement de la fermeture de la fenêtre pour s’arrêter.
- love.update(dt) sert à effectuer des calculs sur nos variables.
- love.draw() est utilisé pour l’affichage graphique de notre jeu.
Un autre schéma représentant le cycle d’exécution de Love2D sur la ligne du temps :

l’indication de temps passé est variable selon plusieurs paramètres que l’on abordera dans le concept du delta time
exemple avec du code :
local compteur = 1
print(compteur.." - commencement de la lecture du fichier main")
function love.load()
compteur = compteur + 1
print(compteur.." - exécution de love.load()")
end
function love.update(dt)
compteur = compteur + 1
print(compteur.." - exécution de love.update(dt)")
end
function love.draw()
compteur = compteur + 1
print(compteur.." - exécution de love.draw()")
if compteur >= 10 then
print(" - etc.")
love.event.quit()
end
end
compteur = compteur + 1
print(compteur.." - fin de la lecture du fichier main")sortie console :
1 - commencement de la lecture du fichier main
2 - fin de la lecture du fichier main
3 - exécution de love.load()
4 - exécution de love.update(dt)
5 - exécution de love.draw()
6 - exécution de love.update(dt)
7 - exécution de love.draw()
8 - exécution de love.update(dt)
9 - exécution de love.draw()
10 - exécution de love.update(dt)
11 - exécution de love.draw()
- etc.
Explications du code :
- on augmente une variable compteur pour nous indiquer l’ordre d’exécution.
- love.event.quit() est une fonction de Love2D qui sert à fermer la fenêtre Love2D et d’arrêter l’exécution du programme.
Je ne peux que vous encourager à essayer par vous-même !
Code Source Love2D Minimaliste
Ci-dessous un code source pour vos projets Love2D minimaliste qui vous servira pour tous vos futurs projets !
Code Source :
-- Cette ligne permet d'afficher des traces dans la console pendant l'exécution
io.stdout:setvbuf('no')
-- Empêche Love de filtrer les contours des images quand elles sont redimensionnées
-- Indispensable pour du pixel art
love.graphics.setDefaultFilter("nearest")
-- Cette ligne permet de déboguer pas à pas dans ZeroBraneStudio
if arg[#arg] == "-debug" then require("mobdebug").start() end
-- debug for Visual Code
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then require("lldebugger").start() end
-------------
love.window.setTitle("Mon Titre de Jeu ")
-------------
function love.load()
end
--
function love.update(dt)
end
--
function love.draw()
end
--
function love.keypressed(key)
print(key)
end
--
function love.mousepressed(x,y,button)
print(button)
end
--
Lien direct vers le code source main.lua :
https://drive.google.com/drive/folders/1OooMjMA6iTPay6jdDl0su0eXWGV62pKi?usp=sharing
Utiliser la gameloop pour la détection des touches du clavier
Charger et afficher l’image
Voici le fichier image que nous utiliserons pour l’exercice :
https://drive.google.com/file/d/1D4flXXyzXZ2uOwitFUxJhd9kfqTLZPgC/view?usp=sharing
Code Source :
-- on charge l'image
monImage = love.graphics.newImage("mascotte.png")
function love.draw()
love.graphics.draw(monImage,30,10) -- on affiche l'image en x = 30 et y = 10
endDéplacer l’image
Nous allons détecter l’utilisation des flèches directionnelles du clavier dans l’update de Love2D.
Si la touche est appuyée alors on déplacera notre image.
Ps : Si vous n’avez pas les flèches vous pouvez les remplacer les touches par ZQSD
Synopsis
love.keyboard.isDown( key )
Arguments
key : KeyConstant la touche qu’on veut vérifier au format text
Returns
renvois un boolean True si la touche est enfoncée, false si ce n’est pas le cas.
Il nous faut aussi assigner des variables pour la position x et y afin de rendre plus lisible tout cela nous allons refactoriser notre code pour que notre image et ses paramètres soit dans une table.
Indiquons un titre a notre fenêtre Love2D avec :
love.window.setTitle()
love.window.setTitle( title )
Arguments
title string Le nouveau titre de la fenêtre.
Code Source :
-- titre de la fenêtre Love2D :
love.window.setTitle("Ma Premiere Image avec Love2D")
monimage = {} -- la table de l'image
monimage.imgdata = love.graphics.newImage("mascotte.png") -- on charge l'image
monimage.x = 30 -- position X de l'image
monimage.y = 10 -- position Y de l'image
function love.update(dt)
-- les déplacement dans l'update :
-- gauche ou droite
if love.keyboard.isDown("left") and love.keyboard.isDown("right") then -- SI gauche ET droite
-- ne rien faire
elseif love.keyboard.isDown("left") then -- SI gauche
monimage.x = monimage.x - 1
elseif love.keyboard.isDown("right") then -- SI droite
monimage.x = monimage.x + 1
end
-- haut ou bas
if love.keyboard.isDown("up") and love.keyboard.isDown("down") then -- SI haut ET bas
-- ne rien faire
elseif love.keyboard.isDown("up") then -- SI haut
monimage.y = monimage.y - 1
elseif love.keyboard.isDown("down") then -- SI bas
monimage.y = monimage.y + 1
end
end
--
function love.draw()
love.graphics.draw(monimage.imgdata, monimage.x, monimage.y)
endRendu :

Compétences acquises :
- détecter des appuis du clavier dans love.update(dt)
- déplacer une image dans love.update(dt)