Próbuję utworzyć animację na płótnie. Po raz pierwszy zadziałało dobrze, ale po dodaniu nowego elementu przez setTimeout, zwiększono prędkość wszystkich elementów. Czy ktoś może mi powiedzieć, dlaczego ta prędkość wzrasta? Fiddle LinkAnimacja płótna Html5 nie działa prawidłowo
var canvas = $("#canvas")[0],
context = canvas.getContext("2d"),
bloons = {},
bloonIndex = 0;
var c_wdh = 360,
c_hgt = 540;
function createBloon(x, y) {
this.x = x;
this.y = y;
this.vx = 1,
this.vy = 3;
bloonIndex++;
bloons[bloonIndex] = this;
this.id = bloonIndex;
}
createBloon.prototype.drawImage = function() {
this.y -= this.vy;
context.fillStyle = "#FF0000";
context.fillRect(this.x, this.y, 50, 50);
if(this.y <= -120){
delete bloons[this.id];
}
};
var nob = 0;
var i = 1;
var rendorBloon = setInterval(function(){
bloons[i] = new createBloon(Math.random() * c_wdh, c_hgt);
var animate = setInterval(function() {
context.clearRect(0, 0, c_wdh, c_hgt);
for (var i in bloons){
bloons[i].drawImage();
}
}, 30);
i++;
nob++;
if(nob >= 10){
clearInterval(rendorBloon);
}
}, 1000);
Wywołujesz setInterval wewnątrz setInterval, zły pomysł ... Również w przypadku animacji użyj ['requestAnimationFrame()'] (https://developer.mozilla.org/en/docs/Web/API/window. requestAnimationFrame), setInterval naprawdę nie jest właściwą metodą, jeśli masz do czynienia z czymkolwiek w oparciu o czas. – Kaiido
Musisz wywołać drugi setInterval poza pierwszym https://jsfiddle.net/v5eoeybe/5/ – jcubic
@jcubic dzięki pracy teraz. –