Animation
Une animation avec Canvas correspond au traçage d'un dessin, de son effacement et à nouveau le traçage du dessin déplacé.
Cette action étant réalisée à intervalle de temps régulier.
Définition : requestAnimationFrame
La fonction window.requestAnimationFrame permet de lancer une fonction (callback) avant le prochain rafraîchissement de l'écran.
Pour réaliser une animation, il faut que la fonction de callback appelle de nouveau window.requestAnimationFrame.
Le rafraîchissement s'effectuant en moyenne 60 fois par seconde, on peut obtenir une animation fluide et homogène.
let nb=0;
// fonction de callback
const action = () => {
nb++;
console.log(nb);
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
Copiez le code dans votre console et testez.
La fonction de callback peut contenir un paramètre de temps. Ce paramètre correspond au temps écoulé en millisecondes depuis l'ouverture de la page.
// fonction de callback
const action = time => {
console.log(time);
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
Calcul de la moyenne de temps écoulée entre deux appels de la fonction.
let before=performance.now(), nb=0, somme=0;
// fonction de callback
const action = time => {
nb++;
somme += time - before
console.log(somme/nb);
before = time;
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
performance.now() : temps écoulé depuis l'ouverture de la page.
Copiez le code dans votre console et testez.
Vous pouvez constater que la moyenne tend vers 16,7ms (1000/60).
Attention, si vous changez d'onglet, il n'y a plus de rafraîchissement d'écran dans l'onglet, donc la moyenne augmente.
Exemple : Animation
Déplacement d'un cercle de gauche à droite puis de droite à gauche.
<canvas width="200" height="150">
Contenu vu par les navigateurs ne supportant pas canvas
</canvas>
<style>
canvas {
border: 2px solid black;
}
</style>
<script>
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let x=1, y=70, dx = 1;
// fonction de traçage du dessin
const dessin = () => {
// trace un cercle si x est compris entre 0 et 200
if(x>0 && x<200){
// efface le contenu du canvas
ctx.clearRect(0,0,200,150);
// trace un cercle en x,y
ctx.beginPath();
ctx.arc(x, y, 10, 0, 2 * Math.PI);
ctx.stroke();
} else{
// change le sens de modification de x
dx = -dx;
}
// modification de x
x = x + dx;
// relance la fonction dessin
window.requestAnimationFrame(dessin);
}
// lancement de la fonction dessin
window.requestAnimationFrame(dessin);
</script>