在HTML5画布上绘制Rects

时间:2012-04-28 19:33:33

标签: javascript html html5 canvas html5-canvas

是否可以在变量中存储矩形以访问该变量并将其移动?类似的东西:

var rect = new Rect();
/* then in update() method */
rect.x += 5;
rect.y += 5;

这样的事情是可能的,还是每次都要使用上下文创建一个新的矩形?如果这是唯一可行的方法,我不明白如何定位画布中绘制的每个矩形。有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:2)

HTML5 Cancas有一个位图模型:绘制时修改画布的像素,如果需要,可以读取像素,但像素的逻辑(线条,线条等)会丢失。

画布模型非常快,可以在对象/矢量模型中执行过长的复杂事物,但限制是您不能更改或删除像rects这样的绘制对象。

如果你想这样做,你需要使用矢量/对象模型,比如SVG(或普通的DOM对象)。

如果你想使用画布和对象,一个解决方案是保持你的rect变量(就像你所做的那样)在普通的javascript(在画布之外),并且每次更改rect时只需重绘整个画布。对于使用canvas(例如游戏)的应用程序来说,它是高效且常见的。

这是一个完整的例子:每10毫秒移动3个rects并重新绘制。

http://jsfiddle.net/dystroy/PkzDA/

我说它非常简单但干净又高效。你可以在真实和快速的应用程序中使用这种逻辑(我愿意)。

答案 1 :(得分:2)

我会用你的坐标保存你想要绘制的所有矩形的模型。 然后,您只需要听取鼠标点击事件(或鼠标悬停事件,无论您需要什么),并浏览模型的每个元素,看看鼠标是否在矩形坐标内完成。

正如之前的海报所说,每次想要对其进行更改时都必须重绘画布(尽管您可以通过仅重绘感兴趣的区域来加快速度)。 希望有所帮助!

编辑:

你可以定义一个矩形对象:

function Rectangle(x, y, w, h) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;

    this.contains = function(x, y) {
        return (x > this.x && x <= (this.x + this.w) &&
            y > this.y && y <= (this.y + this.h));
    }

    this.clone = function() {
        return new Dimension(this.x, this.y, this.w, this.h);
    }
}

然后有一个数组作为你的模型:

var model = [];

然后将矩形添加到其中:

model.push(new Rectangle(10,10,10,10));//x, y, width, height

然后,当您单击画布时,从鼠标事件中检索鼠标单击坐标,然后在数组上循环以查看是否在其中一个矩形内完成了单击:

for (i = 0 ; i < model.length ; i++) {
 if (model[i].contains(mouseEvent.x, mouseEvent.y))
  //do something like redraw your canvas
}

答案 2 :(得分:2)

我发现本教程确实帮助我了解了这个主题。

http://simonsarris.com/blog/510-making-html5-canvas-useful

他完成了对象的创建,跟踪状态,处理鼠标事件等等。

答案 3 :(得分:1)

如果要在画布上移动矩形,则每次更改x或y时都需要清除并重绘该矩形。

答案 4 :(得分:1)

首先,你必须将我要说的内容与@Gaet所说的

结合起来

现在关于减少上下文工作: 重复使用相同画布上下文而不删除它的选项是改变绘制矩形的方式。

您必须将合成样式更改为'xor',因此每当您绘制两次矩形时,它将消失,您将能够将其绘制到新位置。

见下文示例:

//this will switch context to xor mode
ctx.globalCompositeOperation = 'xor';

//this will paint the rectangle
ctx.fillRect(0, 0, 100, 100);

//this will remove the rectangle
ctx.fillRect(0, 0, 100, 100);