Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Un canevas est un contexte 2D mais en ombrant le canevas et les formes on donne l'illusion de la 3D.
Plutôt qu'utiliser setInterval() pour appeler régulièremenent la fonction d'animation, je vais utiliser dans ce chapitre une
nouvelle méthode window.requestAnimationFrame()
Il n'est pas possible de mettre fin à l'animation.
Code HTML :
La balise Canvas étant un élément HTML, on peut lui appliquer un dégradé CSS.
Le script :
Il est possible de mettre fin à l'animation.
La boule se déplace sur le billard ; le billard et la boule sont ombrées pour donner un effet 3D.
Le code HTML :
La balise CANVAS est un élément HTML, on peut donc lui appliquer la propriété CSS box-shadow.
La fonction d'animation est appelée 60 fois par seconde avec window.requestAnimationFrame()
Si vous trouvez que la boule ne se déplace pas assez vite il suffit de modifier les valeurs des variables sensX, sensY
OU vous réduisez les valeurs du repère cartésien défini dans le canevas.
Ce document contient une "toile".
Le script est orienté objet.
J'utilise la POO dans ce script.
Jusqu'à présent j'ai utilisé la méthode clearRect() pour effacer le contenu antérieur du canevas.
Des animations avec effet 3D
Dans ce chapitre je vais vous montrer aussi des outils modernes pour réaliser le script d'animation :
Cette nouvelle méthode appelle la fonction 60 fois par seconde donc rend les animations très fluides.
Attention, il faut deux instructions window.requestAnimationFrame() : une en dehors de la fonction (premier appel)
et une autre dans la fonction (récursivité).
window.cancelAnimationFrame() permet de mettre fin à l'animation.
Une bannière animée avec Canvas
Le code correspondant
function f1()
{
var canevas = document.querySelectorAll('canvas')[0];
var contexte = canevas.getContext('2d');
var X = canevas.width ;
var Y = canevas.height;
contexte.shadowColor = 'grey';
contexte.shadowOffsetX = 6 ;
contexte.shadowOffsetY = 6 ;
contexte.shadowBlur = 6 ;
contexte.textAlign ='left';
contexte.fillStyle = 'olive';
contexte.textBaseline = 'middle';
contexte.lineWidth = 3;
contexte.font = " bold italic 60px arial" ;
var x = X ;
window.requestAnimationFrame(deplacement);
function deplacement()
{
contexte.clearRect(0,0,X,Y);
x = x-2 ;
if(x <-750) x = X ;
contexte.fillText('Meilleurs voeux pour 2022',x,50);
window.requestAnimationFrame(deplacement);
} // fin déplacement
} // fin f1
f1(); // appel f1
Déplacement automatiquement une boule sur un billard
Le canevas (un billard)
Le rebond de la boule est parfaitement géré par le script.
Cliquez dans le billard pour mettre fin à l'animation automatique de la boule rouge
Le code correspondant
Le script
function f2()
{
var canevas = document.querySelectorAll("canvas")[1];
var contexte = canevas.getContext("2d");
var stop;
var X =canevas.width;
var Y =canevas.height;
contexte.shadowColor = 'grey';
contexte.shadowOffsetX = 3 ;
contexte.shadowOffsetY = 3 ;
contexte.shadowBlur = 3 ;
var rayon =9;
var x = X/2; var y = Y/2;
var sensX = 2; var sensY = 1;
contexte.fillStyle ='red';
stop = window.requestAnimationFrame(boule);
function boule()
{
contexte.clearRect(0, 0, X, Y);
contexte.beginPath();
contexte.arc(x, y,rayon, 0, Math.PI*2);
contexte.fill();
if(x > X-rayon || x <= rayon) {sensX =sensX * -1 ;}
if(y >= Y-rayon || y <= rayon) {sensY =sensY * -1 ;}
x = x + sensX ;
y = y + sensY ;
stop = window.requestAnimationFrame(boule);
} // fin boule
canevas.onclick = function() {window.cancelAnimationFrame(stop);}
} // fin fonction f2
f2() ; // appel f2
Pour ombrer une forme du canevas il faut utiliser les quatre propriétés "shadow" de l'API canvas.
Les étapes de la fonction d'animation boule :
Canvas et POO
Le document HTML
Cliquez dans le canevas pour que la balle apparaisse et se déplace.
Placez la souris en dehors du canevas, la boule s'arrête.
Le code du document
Le code HTML
Le script
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var X = canvas.width ;
var Y = canvas.height;
var stop ;
// définition objet balle via la notation JSON
var balle =
{
x: 80,
y: 100,
vx: 4,
vy: 2,
rayon: 20,
color: "red",
dessin: function ()
{
ctx.beginPath();
ctx.arc(this.x, this.y, this.rayon, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fillStyle = this.color;
ctx.fill();
},
}; // fin définition objet balle
function deplacer()
{
ctx.fillStyle = "rgba(255,255,255,0.3)";
ctx.fillRect(0,0,X,Y);
balle.dessin();
balle.x += balle.vx;
balle.y += balle.vy;
// gestion des rebonds
if(balle.x > X-20 || balle.x <= 20) {balle.vx = -balle.vx}
if(balle.y >= Y-20 || balle.y <= 20) {balle.vy = -balle.vy}
stop = window.requestAnimationFrame(deplacer);
} // fin dessiner
canvas.onclick = function() {window.requestAnimationFrame(deplacer);}
canvas.onmouseout = function() {window.cancelAnimationFrame(stop);}
Analyse du script
Programmation orientée objet
Je crée un objet "balle" via la notation JSON.
La POO en JavaScript
Effet de trainée
En remplaçant par la méthode fillRect() et en utilisant un remplissage semi-transparent, on obtient un effet de traînée.
Les deux instructions pour créer cet effet :
ctx.fillStyle = "rgba(255,255,255,0.3)";
ctx.fillRect(0,0,X,Y);