Vous pouvez faire quelque chose comme
var numRects = 10;
var size = 5;
var i = 1; // which rectangle we're drawing
var delay = 1000/60; // num miliseconds between frames
var before = new Date().getTime(), // last draw time in ms
now; // current time in ms
function animateRect() {
// get the current time to find if we should draw
now = new Date().getTime();
// if sufficient time passed since last draw, draw a rect
if (now - before > delay && i <= numRects) {
rect(i * size, i * size, (i * size) * 2, (i * size) * 2);
i++;
before = now;
}
requestAnimFrame(animateRect);
}
Edit:
Comme Blindman67 a souligné ci-dessous, requestAnimFrame
passe l'horodatage en cours depuis le début de l'animation à la rappeler. Voici comment en profiter:
var numRects = 10;
var size = 5;
var i = 1; // which rectangle we're drawing
var delay = 1000/60; // num miliseconds between frames
var before; // last draw time in ms
function animateRect(now) {
if (!before) before = now;
// if sufficient time passed since last draw, draw a rect
if (now - before > delay && i <= numRects) {
rect(i * size, i * size, (i * size) * 2, (i * size) * 2);
i++;
before = now;
}
requestAnimFrame(animateRect);
}
Cependant, cela nécessiterait la modification de la cale l'OP utilise, pour passer l'horodatage en cours à la fonction de rappel dans setTimeout
:
window.requestAnimFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback, /* DOMElement */ element) {
window.setTimeout(callback, 1000/60, new Date.now());
};
})();
C'est exactement ce que je veux atteindre. Merci! – kayee
De rien! – Stiliyan
@kayee Je viens de réaliser que j'avais oublié de mettre à jour le temps de tirage «avant» à chaque tirage. Vous devrez ajouter la ligne 'before = now;' au corps de la condition. Voir mon édition pour plus de détails. – Stiliyan