尝试使用canvas工作获取setTimeout

时间:2012-09-29 07:28:06

标签: javascript animation canvas settimeout

刚开始使用canvas和javascript,无法理解为什么此代码段中的setTimeout不起作用。我最初认为它会触发每个帧,因为它包含在循环中。我试过在animate函数中移动它也无济于事。

$(document).ready(function(){
var canvas = $('#myCanvas');
var context = canvas.get(0).getContext('2d');   

var Shape = function(x1,y1,x2,y2){
    this.x1 = x1
    this.y1 = y1
    this.x2 = x2
    this.y2 = y2
}

var shapes = new Array();

shapes.push(new Shape(0,0,50,50));
shapes.push(new Shape(50,50,50,50));
shapes.push(new Shape(0,100,50,50));
shapes.push(new Shape(50,150,50,50));
shapes.push(new Shape(0,200,50,50));

function animate(){
    for (i=0;i<shapes.length;i++){
        context.clearRect(0,0,500,500);
        context.fillRect(shapes[i].x1,shapes[i].y1,shapes[i].x2,shapes[i].y2);
        setTimeout(animate, 500);
    };
};
animate();
});

2 个答案:

答案 0 :(得分:2)

animate()中出现了问题。

  • 不要在循环中执行setTimeout。这将冻结您的浏览器。
  • for循环中的代码绘制矩形并立即将其擦除。这就是为什么你看不到你的动画。

考虑改变你的代码。

  var i = 0;
  function animate(){
      context.clearRect(0,0,500,500);
      context.fillRect(shapes[i].x1,shapes[i].y1,shapes[i].x2,shapes[i].y2);
      i++;
      if (i == shapes.length) i = 0;
      setTimeout(animate, 500);
  };
  animate();

答案 1 :(得分:0)

setTimeout在循环中创建问题,因为你正在专心地覆盖timeOutId。 你必须改变你的逻辑。把setTimeout放在循环之外。