【问题标题】:HTML5 canvas draw multiple rectangles that move in the canvasHTML5 画布绘制多个在画布中移动的矩形
【发布时间】:2015-10-22 13:55:03
【问题描述】:

在这段代码中,我有一个矩形在 30ticks 处从中左向右移动,但是,当我试图考虑如何添加另一个与反演的相同大小的正方形时,我的大脑很痛,但是开始从不同的方向。问题是我如何添加多个对象,无论是矩形圆形并让它像正方形一样在另一个起始 x y 位置进行动画处理,这就是我目前所拥有的:

        var rectY=200, rectW=40;
        var rectX = -rectW;
        var canvas = null;
        var context = null;

        function init() {
            canvas = document.getElementById('testCanvas');
            context = canvas.getContext("2d");

            blank();

            context.fillStyle= "yellow";
            context.fillRect(rectX,rectY,rectW,rectW);
            setInterval(anim, 30);
        }

        function blank() {
            context.fillStyle = "#00ddee";
            context.fillRect(0,0,context.canvas.width, context.canvas.height);
        }

        function anim() {
            if (rectX < context.canvas.width) {
                blank();
                rectX += 5;
                context.fillStyle = "yellow";
                context.strokeStyle = "red";
                context.lineWidth = 3;
                context.fillRect(rectX,rectY,rectW,rectW);
                context.strokeRect(rectX,rectY,rectW,rectW);
            }
            else rectX=-rectW;
        }

【问题讨论】:

  • 哇,你为自己做这件事太难了。使用起来更容易svg。或者,如果您只是处理矩形,divs 可以!对于运动,CSS 动画怎么样?还是jQuery 动画?还是其他一些js库?

标签: javascript html animation canvas


【解决方案1】:

使用 JavaScript 对象表示多个矩形

这里是如何做到这一点的大纲:

  • 使用 javascript 对象来描述每个矩形
  • 将每个 rect 对象放入一个 rects[] 数组中
  • 在动画循环中:
    • 更改每个矩形的x 值
    • 用新位置的矩形重绘画布
    • 在动画中请求另一个循环

带注释的代码和演示:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

// define a rect using a javascript object
var rect1={
  x:20,
  y:20,
  width:40,
  height:40,
  directionX:1
}

// define another rect using a javascript object
var rect2={
  x:250,
  y:90,
  width:40,
  height:40,
  directionX:-1
}

// put each rect in a rects[] array
var rects=[rect1,rect2];

// start the animation loop
requestAnimationFrame(animate);

function animate(time){

  // move each rect in the rects[] array by its 
  // own directionx
  for(var i=0;i<rects.length;i++){
    rects[i].x+=rects[i].directionX;
  }

  // draw all the rects in their new positions
  draw();

  // request another frame in the animation loop
  requestAnimationFrame(animate);
}

function draw(){
  ctx.clearRect(0,0,cw,ch);
  for(var i=0;i<rects.length;i++){
    var r=rects[i]
    ctx.strokeRect(r.x,r.y,r.width,r.height);
  }
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
&lt;canvas id="canvas" width=300 height=300&gt;&lt;/canvas&gt;

我留给你做的一个改进是在所有矩形都离开可见画布时停止动画。

【讨论】:

    【解决方案2】:

    这是OOP(面向对象编程)的重点,程序中的每个项目都表示为一个对象。在您的情况下,我们可以有一个 Square 对象,它具有:x、y、宽度和颜色。以及一个绘制自己的函数anim():

    function Square(x, y, w, color) 
    {
        this.x = x;
        this.y = y;
        this.w = w;
        this.color = color;
    
        this.anim = function() 
        {
            if (this.x < context.canvas.width) {
                this.x += 5;
                context.fillStyle = this.color;
                context.strokeStyle = "red";
                context.lineWidth = 3;
                context.fillRect(this.x,this.y,this.w,this.w);
                context.strokeRect(this.x,this.y,this.w,this.w);
            }
            else this.x=-this.w;
        }
    }
    

    然后您可以轻松地创建对象,为每个对象设置动画,将它们放在一个数组中,并为objects 中的每个方块调用anim():

    var rect1 = new Square(-40, 200, 40, "yellow");
    var rect2 = new Square(0, 100, 40, "blue");
    var objects = [ rect1, rect2 ];
    
    setInterval(function(){
        blank();
        for(rect in objects){
            objects[rect].anim();
        }
    }, 30);
    

    Fiddle Example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多